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:
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()); } }
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):