O mana robotica ce poate fi utilizata ca o mana obisnuita, avand control asupra fiecarui deget. Acestea sunt controlate de cate un servomotor si cate un rezistor de tip flex.
Controlul fiecarui deget este realizat prin intermediul citirii unei valori prin fiecare pin (A0, A1, …, A4), reprezentand gradul de indoire a rezistentei. Mai departe, prin pinii digitali de la 2 la 6 sunt controlate servomotarele pentru a misca degetele.
Piese folosite:
Pentru a folosi aceasta configuratie, conectam fiecare modul bluetooth la cate o placuta Arduino UNO, astfel:
Mai departe, conectam servomotoarele la pinii 2, 3, 4, 5, 6 de la modulul Master, iar rezistentele la pinii A0, A1, A2, A3, A4 de la modulul Slave.
Pentru dezvoltarea software am folosit Arduino IDE, iar ca biblioteci, <Servo.h> si <SoftwareSerial.h>.
Singurul dezavantaj la aceasta metoda este faptul ca suntem constransi la indoirea totala a degetelor.
Pentru Master:
#include <SoftwareSerial.h> #include <Servo.h> #include <stdint.h> SoftwareSerial mySerial(10, 11); Servo thumb, index, middle, ring, pinky; Servo fingers[5] = {thumb, index, middle, ring, pinky}; int servoPins[5] = {2, 3, 4, 5, 6}; int bent[5] = {0, 0, 0, 0, 0}; int initAngles[5] = {90, 55, 55, 90, 90}; int angles[5] = {180, 180, 180, 90, 90}; int flexSensorMidPoints[5] = {900, 550, 550, 500, 500}; int flexSensorValue; int handPin; int read; void setup() { thumb.attach(2); index.attach(3); middle.attach(4); ring.attach(5); pinky.attach(6); for (int i = 0; i < 5; i++) { fingers[i].write(initAngles[i]); } Serial.begin(9600); mySerial.begin(38400); delay(1000); } void loop() { read = 0; if (mySerial.available() >= 3) { read = 1; handPin = mySerial.read(); uint8_t highByte = mySerial.read(); uint8_t lowByte = mySerial.read(); flexSensorValue = (highByte << 8) | lowByte; Serial.print("From "); Serial.print(handPin); Serial.print(": "); Serial.println(flexSensorValue); } if (read == 1) { if (flexSensorValue > flexSensorMidPoints[handPin] && bent[handPin] == 0) { Serial.print("Bent from "); Serial.print(handPin); Serial.print(": "); Serial.println(flexSensorValue); Serial.println("-------------------------"); fingers[handPin].write(angles[handPin]); bent[handPin] = 1; } else if (flexSensorValue <= flexSensorMidPoints[handPin] && bent[handPin] == 1) { Serial.print("Release from "); Serial.print(handPin); Serial.print(": "); Serial.println(flexSensorValue); Serial.println("-------------------------"); bent[handPin] = 0; fingers[handPin].write(initAngles[handPin]); } } }
Pentru Slave:
#include <SoftwareSerial.h> #include <stdint.h> int flexSensorPins[5] = {A0, A1, A2, A3, A4}; SoftwareSerial mySerial(10, 11); void setup() { Serial.begin(9600); mySerial.begin(38400); } void loop() { for (int i = 0; i < 5; i++) { int flexSensorValue = analogRead(flexSensorPins[i]); uint8_t highByte = flexSensorValue >> 8; uint8_t lowByte = flexSensorValue & 0xFF; mySerial.write(i); mySerial.write(highByte); mySerial.write(lowByte); delay(1000); } }
Pentru configurarea HC05
#include <SoftwareSerial.h> SoftwareSerial BTserial(10, 11); // RX || TX void setup() { // For enableling AT mode pinMode(9, OUTPUT); digitalWrite(9, HIGH); Serial.begin(9600); Serial.println("Enter AT command"); BTserial.begin(38400); } void loop() { if (Serial.available()) { BTserial.write(Serial.read()); } if (BTserial.available()) { Serial.write(BTserial.read()); } }
Mai jos se poate observa varianta finala a proiectului. Suportul pentru mana este realizat, destul de “primitiv”, din stinghii de lemn intre care am fixat cele 5 servomotoare. In capatul acestora am atasat, folosind un pistol de lipit, mana protetica.
In continuare, in stanga se afla modulul MASTER, la care sunt conectate servomotoarele, iar in dreapta, modulul SLAVE, la care sunt conectate rezistentele de flex.
Ultimul element prezent in imagine este manusa cu ajutorul careia controlam mana. Se poate vedea ca pe fiecare deget este atasat cate un senzor de flex.
Toate acestea sunt conectate la un VCC si GND comun, impreuna cu placutele Arduino UNO care le comandeaza.