braccio_robotico
Differenze
Queste sono le differenze tra la revisione selezionata e la versione attuale della pagina.
| Entrambe le parti precedenti la revisioneRevisione precedenteProssima revisione | Revisione precedente | ||
| braccio_robotico [2020/10/08 13:24] – [Shield servo RC] admin | braccio_robotico [2023/03/07 08:23] (versione attuale) – [Collaudo] admin | ||
|---|---|---|---|
| Linea 1: | Linea 1: | ||
| + | |||
| + | |||
| + | |||
| ====== Braccio Robotico ====== | ====== Braccio Robotico ====== | ||
| Linea 89: | Linea 92: | ||
| * Imax = 2A (i servo più grandi assorbono al massimo 1,2A) | * Imax = 2A (i servo più grandi assorbono al massimo 1,2A) | ||
| e scegliere: | e scegliere: | ||
| - | * Cin (elettrolitico da 100uF?) | + | * Cin (elettrolitico da 100uF) |
| - | * Cout (elettrolitico da 1000uF?) | + | * Cout (elettrolitico da 1000uF) |
| - | * L1 (220uH | + | * L1 (220uH) |
| * D1 = 1N5822 | * D1 = 1N5822 | ||
| Linea 173: | Linea 176: | ||
| * U1 TO220-T05B (va già bene quello scelto in Multisim, è solo brutto il render nella vista 3D) | * U1 TO220-T05B (va già bene quello scelto in Multisim, è solo brutto il render nella vista 3D) | ||
| - | Tentare il primo sbroglio seguendo le indicazioni di figura 32 del datasheet (collegamenti in grassetto devono essere corti e grossi). Tracce da 1mm. Piazzole tonde con fori da 0.8 e diametro 2,6 dove possibile altrimenti ovali custom (vedi [[https:// | + | Tentare il primo sbroglio seguendo le indicazioni di figura 32 del datasheet (collegamenti in grassetto devono essere corti e grossi). Tracce da 1mm. Piazzole tonde con fori da 0.8 e diametro 2,6 dove possibile altrimenti ovali custom (vedi [[https:// |
| Se è necessario realizzare dei collegamenti nel lato top bisogna piazzare delle via: | Se è necessario realizzare dei collegamenti nel lato top bisogna piazzare delle via: | ||
| Linea 196: | Linea 199: | ||
| * aggiungere i pin alla net giusta selezionando prima la net e aggiungendo i pin col pulsante con la freccia sotto al pulsante //Add// | * aggiungere i pin alla net giusta selezionando prima la net e aggiungendo i pin col pulsante con la freccia sotto al pulsante //Add// | ||
| + | ===== Collaudo ===== | ||
| + | |||
| + | Montata la scheda single layer((da progetto degli studenti D' | ||
| + | * diodo di protezione 1N4007 | ||
| + | * diodo shottky 1N5819 | ||
| + | * Cin 100uF | ||
| + | * Cout 1000uF | ||
| + | * induttore 220uH | ||
| + | * morsetto a vite | ||
| + | * resistori da 1k e 2,7k | ||
| + | * trimmer da 500 | ||
| + | * LM2576-ADJ((occhio che nel cassettino ci sono anche gli LM2576-5 a 5V fissi e occhio anche al verso!)) dopo aver piegato tre piedini | ||
| + | * stripline maschio-maschio lunghe | ||
| + | |||
| + | Per tutti i componenti punta da 0,8mm tranne che per: stripline, morsetto a vite, induttore, regolatore dove serve la punta da 1mm. | ||
| + | |||
| + | La scheda è stata collaudata usando un reostato come carico e 100mA di corrente e la tensione in uscita, regolata con l' | ||
| + | |||
| + | {{: | ||
| + | |||
| + | |||
| + | Si osserva un ripple di circa 20mV e il tipico andamento della tensione su Vout prodotta dalla commutazione del regolatore. | ||
| + | |||
| + | ===== Software ===== | ||
| + | |||
| + | |||
| + | Ho usato la libreria servo e l' | ||
| + | |||
| + | FIXME aggiustare i valori dopo la riparazione | ||
| + | |||
| + | Range valori per i 5 attuatori: | ||
| + | * pinza pin 5: 0 aperto, 60 chiuso | ||
| + | * polso2 pin 6: 0 90° a sinistra, 90 orizzontale, | ||
| + | * polso1 pin 9: 50 a terra, 120 tutto indietro | ||
| + | * braccio pin 10: stare tra 80 (alto) e 120 (basso) col braccio avanzato | ||
| + | * base pin 11: 80 sinistra 45°, 40 dritto, 0 45° a destra | ||
| + | |||
| + | Codice adattato da [[https:// | ||
| + | |||
| + | <code C> | ||
| + | /* da https:// | ||
| + | | ||
| + | | ||
| + | | ||
| + | */ | ||
| + | |||
| + | #include < | ||
| + | |||
| + | // per il range di valori vedi qui | ||
| + | // https:// | ||
| + | Servo base; // 1 0 - 180 | ||
| + | Servo shoulder; | ||
| + | Servo elbow; | ||
| + | Servo wrist_rot; | ||
| + | Servo gripper; | ||
| + | |||
| + | // posizione iniziale | ||
| + | byte pos[5] | ||
| + | // serve per la funzione goPos() | ||
| + | byte oldpos[5] = {90, | ||
| + | |||
| + | // sequenza coordinate | ||
| + | //byte seq[][5] = { | ||
| + | // {90, | ||
| + | // {110, | ||
| + | // {110, | ||
| + | // {110, | ||
| + | // {30, | ||
| + | // {30, | ||
| + | // {30, | ||
| + | // {90, | ||
| + | // {90, | ||
| + | // {90, | ||
| + | // {40, | ||
| + | // {40, | ||
| + | // {40, | ||
| + | // {70, | ||
| + | // {70, | ||
| + | // {70, | ||
| + | // {45, | ||
| + | // {45, | ||
| + | // {45, | ||
| + | // {90, | ||
| + | //}; | ||
| + | |||
| + | byte seq[][5] = { | ||
| + | {90, | ||
| + | {140, | ||
| + | {140, | ||
| + | {140, | ||
| + | {140, | ||
| + | {90, | ||
| + | {90, | ||
| + | {90, | ||
| + | }; | ||
| + | |||
| + | // avvio se arriva del testo da seriale | ||
| + | bool run = false; | ||
| + | |||
| + | void setup() { | ||
| + | Serial.begin(115200); | ||
| + | |||
| + | // abbinamento servo-pin | ||
| + | base.attach(11); | ||
| + | shoulder.attach(10); | ||
| + | elbow.attach(9); | ||
| + | wrist_rot.attach(6); | ||
| + | gripper.attach(5); | ||
| + | |||
| + | // comando posizione iniziale | ||
| + | base.write(pos[0]); | ||
| + | shoulder.write(pos[1]); | ||
| + | elbow.write(pos[2]); | ||
| + | wrist_rot.write(pos[3]); | ||
| + | gripper.write(pos[4]); | ||
| + | |||
| + | Serial.println( "#### invia testo per avviare e per fermare la sequenza ####" ); | ||
| + | } | ||
| + | |||
| + | void loop() { | ||
| + | |||
| + | startStop(); | ||
| + | while (run) { | ||
| + | |||
| + | for ( byte line=0; line < (sizeof(seq)/ | ||
| + | Serial.print(" | ||
| + | for( byte i=0; i<5; i++ ) { | ||
| + | Serial.print(" | ||
| + | pos[i] = seq[line][i]; | ||
| + | } | ||
| + | Serial.print(" | ||
| + | goPos(0, | ||
| + | goPos(1, | ||
| + | goPos(2, | ||
| + | goPos(3, | ||
| + | goPos(4, | ||
| + | delay(1000); | ||
| + | startStop(); | ||
| + | } | ||
| + | delay(2000); | ||
| + | } | ||
| + | } | ||
| + | |||
| + | void goPos(byte servo, Servo instance, byte pause) { | ||
| + | if (oldpos[servo] >= pos[servo]) { | ||
| + | for ( byte i = oldpos[servo]; | ||
| + | instance.write(i); | ||
| + | delay(pause); | ||
| + | } | ||
| + | } | ||
| + | if (oldpos[servo] <= pos[servo]) { | ||
| + | for ( byte i = oldpos[servo]; | ||
| + | instance.write(i); | ||
| + | delay(pause); | ||
| + | } | ||
| + | } | ||
| + | | ||
| + | } | ||
| + | |||
| + | void startStop() { | ||
| + | // se arriva del testo dal monitor seriale | ||
| + | if (Serial.available()> | ||
| + | // senza questo ritardo non legge tutti i dati del buffer! | ||
| + | delay(10); | ||
| + | Serial.println(" | ||
| + | Serial.print(" | ||
| + | Serial.println(Serial.available()); | ||
| + | // svuota il buffer | ||
| + | clearInputBuffer(); | ||
| + | Serial.print(" | ||
| + | Serial.println(Serial.available()); | ||
| + | // toggle della variabile che attiva la sequenza | ||
| + | run = !run; | ||
| + | Serial.print(" | ||
| + | Serial.println(run); | ||
| + | } | ||
| + | } | ||
| + | |||
| + | void clearInputBuffer() { | ||
| + | while (Serial.available() > 0) { | ||
| + | char t = Serial.read(); | ||
| + | } | ||
| + | } | ||
| + | |||
| + | </ | ||
| ===== Risorse ===== | ===== Risorse ===== | ||
| Linea 202: | Linea 390: | ||
| * [[alimentatori_switching# | * [[alimentatori_switching# | ||
| * {{ :: | * {{ :: | ||
| + | * {{ : | ||
| + | * {{ :: | ||
| ===== Navigazione ===== | ===== Navigazione ===== | ||
braccio_robotico.1602163474.txt.gz · Ultima modifica: da admin
