This is an old revision of the document!
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.
Am folosit potentiometrele drept reprezentare pentru rezistentele de tip flex.
Pentru a facilita utilizarea mainii, am folosit doua module bluetooth HC05 intr-o configuratie Master-Slave. Astfel, modulul Slave trasmite la Master valorile citite de la pinii analogici, iar modulul Master decide daca e cazul sau nu sa activeze un servotor.
Pentru a folosi aceasta configuratie, conectam fiecare modul bluetooth la cate o placuta Arduino UNO, astfel:
Din motive prezentate in sectiunea de mai jos, cea mai buna solutie pentru comandarea servomotoarelor a fost urmatoarea: calculez, pentru fiecare rezistenta, o valoare minima pentru care pot sa fiu sigur ca degetul este indoit. Astfel, pentru toate citirile mai mari decat aceasta, activez servomotorul pentru degetul respectiv.
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()); } }
Dupa ce incarcam codul de mai sus pe o placuta Arduino UNO si legam modulul la fel ca la sectiunea Hardware (cu precizarea ca pinul EN/KEY este legat la pinul 9 de pe placuta), trebuie sa dam urmatorele comenzi (daca vrem sa ne asiguram ca am conectat modulul bine, la tastarea comenzii AT, terminalul trebuie sa ne afiseze OK; acest lucru este valabil si pentru comenzile ce urmeaza):