This is an old revision of the document!
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>.
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()); } }
Exista un oarecare control asupra fiecarui deget, insa din cauza rezistentelor si a uzurii prin folosinta, acesta nu este permanent. Pentru a vedea cele mai bune rezultate, trebuie sa strangem pumnul, asigurandu-ne astfel ca toate rezistentele vor afisa valori peste minimul necesar indoirii.