sketch_61_nano_servos_schwenken (Arduino Nano)
sketch_61_nano_servos_schwenken
/*Es wird Arduino Nano auf I/O Erweiterungs Shield Modul verwendet.
Die Spannungsversorgung der Servos geht direkt von 5V oder von 3,3V (drehen langsamer) des Nano.
Nur moeglich bei Micro Servos SG90 und wenn immer nur ein Servo angesteuert wird (die anderen stromlos).
Alle 4 Servos des Roboters werden nacheinander geschwenkt:
1. auf Mittelstellung 0 Grad gebracht (Greifer: halb geoeffnet)
2. nach links max (Greifer: voll geoeffnet)
3. nach rechts max (Greifer: geschlossen)
4. auf Mittelstellung zurueck
HIGH-Impuls fuer Mittelstellung theoretisch 1,5ms kann aber abweichen (experimentell ermitteln).
Die "for"-Schleife sorgt dafuer, dass der Servo so lange aktiviert bleibt bis er seine Zielstellung erreicht hat.
Danach haelt er die Position nicht mehr, man kann von Hand verdrehen.
Die gesamte Bewegung soll nur einmal ablaufen, deshalb nur im void setup.
Waere alternativ bei Arduino (aber nicht beim ESP) auch moeglich im loop, Beendigung Sketch mit for(;;){}.
Bei "Werkzeugen" muss eingetragen sein: Board "Arduino Nano" / Prozessor:"ATmega 328 Old Bootloader".
*/
#include "Greifer.h"
#include "Drehung.h"
#include "Heben.h"
#include "VorZurueck.h"
void setup()
{
pinMode(2, OUTPUT); //Nano digital Pin D2 (Ausgang zu Servo Drehung)
pinMode(4, OUTPUT); //Nano digital Pin D4 (Ausgang zu Servo Greifer)
pinMode(6, OUTPUT); //Nano digital Pin D6 (Ausgang zu Servo Heben)
pinMode(8, OUTPUT); //Nano digital Pin D8 (Ausgang zu Servo VorZurueck)
Drehung();
delay (500);
Greifer();
delay (500);
Heben();
delay (500);
VorZurueck();
}
void loop(){} //bleibt leer
Drehung.h
void Drehung()
{
for(int i=0; i<=60 ; i++) //Wird i-mal wiederholt, der Servo hat i x 20ms Zeit seine Position zu erreichen
{
digitalWrite(2,HIGH);
delayMicroseconds(1350); //Zeitvorgabe High-Impuls, fuer Mittelposition (experimentell ermitteln)
digitalWrite(2,LOW);
delay(19); //Ergaenzung auf Zykluszeit etwa 20ms (delayMicroseconds funktioniert nur bis 16383 "integer")
}
for(int i=0; i<=60 ; i++) //Wird i-mal wiederholt, der Servo hat i x 20ms Zeit seine Position zu erreichen
{
digitalWrite(2,HIGH);
delayMicroseconds(2200); //Zeitvorgabe High-Impuls, fuer max Rechts (experimentell ermitteln)
digitalWrite(2,LOW);
delay(18); //Ergaenzung auf Zykluszeit etwa 20ms
}
for(int i=0; i<=60 ; i++) //Wird i-mal wiederholt, der Servo hat i x 20ms Zeit seine Position zu erreichen
{
digitalWrite(2,HIGH);
delayMicroseconds(600); //Zeitvorgabe High-Impuls, fuer max Links (experimentell ermitteln)
digitalWrite(2,LOW);
delay(20); //Ergaenzung auf Zykluszeit etwa 20ms
}
for(int i=0; i<=60 ; i++) //Wird i-mal wiederholt, der Servo hat i x 20ms Zeit seine Position zu erreichen
{
digitalWrite(2,HIGH);
delayMicroseconds(1350); //Zeitvorgabe High-Impuls, fuer Mittelposition (experimentell ermitteln)
digitalWrite(2,LOW);
delay(20); //Ergaenzung auf Zykluszeit etwa 20ms
}
}
Greifer.h
void Greifer()
{
for(int i=0; i<=60 ; i++) //Wird i-mal wiederholt, der Servo hat i x 20ms Zeit seine Position zu erreichen
{
digitalWrite(4,HIGH);
delayMicroseconds(1200); //Zeitvorgabe High-Impuls, fuer Mittelposition (experimentell ermitteln)
digitalWrite(4,LOW);
delay(19); //Ergaenzung auf Zykluszeit etwa 20ms (delayMicroseconds funktioniert nur bis 16383 "integer")
}
for(int i=0; i<=60 ; i++) //Wird i-mal wiederholt, der Servo hat i x 20ms Zeit seine Position zu erreichen
{
digitalWrite(4,HIGH);
delayMicroseconds(2000); //Zeitvorgabe High-Impuls, fuer max Oeffnen (experimentell ermitteln)
digitalWrite(4,LOW);
delay(18); //Ergaenzung auf Zykluszeit etwa 20ms
}
for(int i=0; i<=60 ; i++) //Wird i-mal wiederholt, der Servo hat i x 20ms Zeit seine Position zu erreichen
{
digitalWrite(4,HIGH);
delayMicroseconds(500); //Zeitvorgabe High-Impuls, fuer Schliessen (experimentell ermitteln)
digitalWrite(4,LOW);
delay(20); //Ergaenzung auf Zykluszeit etwa 20ms
}
for(int i=0; i<=60 ; i++) //Wird i-mal wiederholt, der Servo hat i x 20ms Zeit seine Position zu erreichen
{
digitalWrite(4,HIGH);
delayMicroseconds(1200); //Zeitvorgabe High-Impuls, fuer Mittelposition (experimentell ermitteln)
digitalWrite(4,LOW);
delay(20); //Ergaenzung auf Zykluszeit etwa 20ms
}
}
Heben.h
void Heben()
{
for(int i=0; i<=60 ; i++) //Wird i-mal wiederholt, der Servo hat i x 20ms Zeit seine Position zu erreichen
{
digitalWrite(6,HIGH);
delayMicroseconds(1350); //Zeitvorgabe High-Impuls, fuer Mittelposition (experimentell ermitteln)
digitalWrite(6,LOW);
delay(19); //Ergaenzung auf Zykluszeit etwa 20ms (delayMicroseconds funktioniert nur bis 16383 "integer")
}
for(int i=0; i<=60 ; i++) //Wird i-mal wiederholt, der Servo hat i x 20ms Zeit seine Position zu erreichen
{
digitalWrite(6,HIGH);
delayMicroseconds(2200); //Zeitvorgabe High-Impuls, fuer max Oben (experimentell ermitteln)
digitalWrite(6,LOW);
delay(18); //Ergaenzung auf Zykluszeit etwa 20ms
}
for(int i=0; i<=60 ; i++) //Wird i-mal wiederholt, der Servo hat i x 20ms Zeit seine Position zu erreichen
{
digitalWrite(6,HIGH);
delayMicroseconds(600); //Zeitvorgabe High-Impuls, fuer max Unten (experimentell ermitteln)
digitalWrite(6,LOW);
delay(20); //Ergaenzung auf Zykluszeit etwa 20ms
}
for(int i=0; i<=60 ; i++) //Wird i-mal wiederholt, der Servo hat i x 20ms Zeit seine Position zu erreichen
{
digitalWrite(6,HIGH);
delayMicroseconds(1350); //Zeitvorgabe High-Impuls, fuer Mittelposition (experimentell ermitteln)
digitalWrite(6,LOW);
delay(20); //Ergaenzung auf Zykluszeit etwa 20ms
}
}
VorZurueck.h
void VorZurueck()
{
for(int i=0; i<=60 ; i++) //Wird i-mal wiederholt, der Servo hat i x 20ms Zeit seine Position zu erreichen
{
digitalWrite(8,HIGH);
delayMicroseconds(1600); //Zeitvorgabe High-Impuls, fuer Mittelposition (experimentell ermitteln)
digitalWrite(8,LOW);
delay(19); //Ergaenzung auf Zykluszeit etwa 20ms (delayMicroseconds funktioniert nur bis 16383 "integer")
}
for(int i=0; i<=60 ; i++) //Wird i-mal wiederholt, der Servo hat i x 20ms Zeit seine Position zu erreichen
{
digitalWrite(8,HIGH);
delayMicroseconds(2100); //Zeitvorgabe High-Impuls, fuer max Vor (experimentell ermitteln)
digitalWrite(8,LOW);
delay(18); //Ergaenzung auf Zykluszeit etwa 20ms
}
for(int i=0; i<=60 ; i++) //Wird i-mal wiederholt, der Servo hat i x 20ms Zeit seine Position zu erreichen
{
digitalWrite(8,HIGH);
delayMicroseconds(1300); //Zeitvorgabe High-Impuls, fuer max Zurueck (experimentell ermitteln)
digitalWrite(8,LOW);
delay(20); //Ergaenzung auf Zykluszeit etwa 20ms
}
for(int i=0; i<=60 ; i++) //Wird i-mal wiederholt, der Servo hat i x 20ms Zeit seine Position zu erreichen
{
digitalWrite(8,HIGH);
delayMicroseconds(1350); //Zeitvorgabe High-Impuls, fuer Mittelposition (experimentell ermitteln)
digitalWrite(8,LOW);
delay(20); //Ergaenzung auf Zykluszeit etwa 20ms
}
}