WALTER: Een Arduino-aangedreven fotovoor insectenrobot
Onderdelen en benodigdheden
- SparkFun Arduino Pro Mini 328 - 5V/16MHz – 1 stuk
- Ultrasone sensor - HC-SR04 (Generiek) – 3 stuks
- Fotodiodes – 4 stuks
- Weerstand 100k ohm – 4 stuks
- MG90S Metal Gear Micro Servo – 5 stuks
- Draagbare powerbank voor smartphones (2 kanalen: 1A en 2.1A) – 1 stuk
Benodigde tools en machines
- Solderbout (generiek)
- Lijmpistool (generiek)
Apps en online diensten
- Arduino IDE
Over dit project
[Excuses voor mijn Engels]
Ik vind de populaire opstelling van 2-servo Arduino-insecten op YouTube erg leuk. Toen ik ernaar keek, deed ik me altijd herinneren wat BEAM-robotica-fanaten er lang daarvoor al deden. Deze analoge robotliefhebbers bereikten een betere loopgang door een betere hoek tussen de twee motoren (microcore / bicore walker, etc.).
Niettemin lijkt geen van de bovenstaande zo levendig als VBug1.5 (ook bekend als Walkman), geschapen door de grondlegger van BEAM-robotica, Mark Tilden. Die gebruikt 5 motoren, wat meer manoeerbaarheid geeft.
Een eenvoudige BEAM-robot bouwen is niet moeilijk, maar iets zo complex als de VBug1.5 kan overweldigend zijn voor een elektronica-beginner als ik. Toen ik besloot iets als Tildens insecten te maken, koos ik voor het Arduino-platform, de makkelijkste keuze voor niet-ingenieurs (of in mijn geval, schaamteloos gezegd, een ingenieur-wannabe).
Het resultaat is Walter, een 4-potige Arduino-robot met 5 servo's. Je vraagt je misschien af: waarom niet 8 of 12 servo's als ik een levendig insect wilde? Ik dacht aan de simpelste manier om de meeste manoeerbaarheid te krijgen. Ik praat over veel lijm in plaats van frames maken.
GEDRAGEN
Als veel andere Arduino-robots kan Walter obstakels vermijden met HC-SR04 ultrasone sensoren. Om karakter als insect toe te voegen, is Walter ook een fotovoor: hij wordt aangetrokken door licht. Fotodiodes detecteren licht. Willekeurige waarden in de Arduino-sketch laten Walter beslissen wanneer hij wil rusten en willekeurig zijn loopgangssnelheid veranderen (3 snelheden).
Ik wilde aanvankelijk tastknoppen onder elke voet van Walter voor oppervlakte-sensoren. Maar de batterij (een powerbank) weegt zwaar voor de servo's. IJzer genoeg: tastknoppen wegen bijna niets, maar het gewicht van de robot is niet genoeg om de omgekeerde knoppen in te drukken.
Ik plan Walter versie 2 met grotere servo's en dan deze knoppen als oppervlakte-sensoren toe te voegen.
Meer details
De complete code is te vinden in de sectie "Code". Het is een uitgebreide sketch met veel commentaar en markeerders (****, ***, **) die aangeven welke waarden je moet kalibreren of aanpassen voor jouw hardware.
Code
WALTER.ino
/* WALTER - DE 4-POTIGE FOTOVOOR
Deze Arduino sketch is mijn poging om een 5-servo vierpotige robot te bouwen genaamd "WALTER".
Om deze sketch te gebruiken, moet je waarschijnlijk sommige waarden aanpassen voor je comfort of hardware.
Zoek (Ctrl+F) deze markeringen om makkelijk te vinden welke waarden aangepast moeten worden:
- **** : Deze markeringen betekenen dat het de servo's middenpositie is en gekalibreerd moet worden (je robotpoten's positie in rust).
- *** : Deze markeringen betekenen Arduino-pin toewijzing (sensoren & servo's verbinding met Arduino). Raadpleeg dit bij het bouwen.
- ** : Deze markeringen betekenen dat de waarden optioneel gewijzigd kunnen worden naar smaak (stapwijdte, hoeveel te draaien bij licht/obstakel, etc). Laat ze staan als je niet weet wat je doet.
Je kunt deze sketch op eigen risico gebruiken... en het wordt geleverd "as is"...
Yohanes Martedi - 2015 */
#include <Servo.h>
// ****Kalibreer servo's middenhoek (in microseconden want we gebruiken "xx.writeMicroseconds();"). Start met 1500.
const int ANGLE_mid_Shaft = 1520;
const int ANGLE_mid_FLeft = 1550;
const int ANGLE_mid_FRight = 1570;
const int ANGLE_mid_BLeft = 1450;
const int ANGLE_mid_BRight = 1450;
const int ANGLE_sweep = 250; // **Zet deze waarde (in microseconden) om te bepalen hoe wijd de servo's zwiepen (stapwijdte). Groter = wijder.
const int ANGLE_res = 10; // **Zet de servo-bewegingsresolutie (in microseconden) op minimaal de standaard dode zone van de servo (hoogste resolutie) of meer (lagere resolutie). Voorbeeld: SG90 dode zone is 10 microseconden.
int sweepSPEED;
int sweepSPEED_Rand[3] = {4, 6, 8}; // **Servo-snelheid (loopgangssnelheid) verandert willekeurig in 3 modi. Zet snelheid (in milliseconden) voor elke modus. Kleiner = sneller.
const int ANGLE_turnMAX = ANGLE_sweep * 1.5; // **Maximale draai naar licht. Groter = grotere draai.
const int ANGLE_turnNARROW = ANGLE_sweep * 0.25; // **Maximale draai bij obstakels aan zijkanten in smalle ruimte. Groter = grotere draai.
const int SONAR_sum = 3; // Aantal sonars.
const int PHOTO_sum = 4; // Aantal fotodiodes.
int PIN_trig[SONAR_sum] = {13, 11, 8}; // ***Arduino pinnen verbonden met ultrasone sensor trigger pinnen; {voor, links, rechts}.
int PIN_ec[SONAR_sum] = {12, 10, 7}; // ***Arduino pinnen verbonden met ultrasone sensor echo pinnen; {voor, links, rechts}.
int PIN_PHOTO[PHOTO_sum] = {2, 3, 1, 0}; // ***Arduino analoge ingangspinnen verbonden met fotodiodes; {voor-links, voor-rechts, achter-links, achter-rechts}.
const int distRotate = 25; // **Minimale afstand (cm) voor robot om obstakel te vermijden door te draaien.
const int distRetreat = 10; // **Minimale afstand (cm) voor robot om obstakel te vermijden door terug te gaan.
const int distTurn = 20; // **Minimale afstand (cm) voor robot om obstakel te vermijden door te bochten.
const int counter_gait_max = 8; // **Aantal stappen dat robot neemt om obstakel te vermijden (bij draaien of teruggaan).
const int RUN_time = 25000; // **Hoe lang de bot loopt (in milliseconden).
const int REST_time = 3000; // **Hoe lang de bot rust (in milliseconden).
// ID's voor sonars:
int SONAR_id;
const int FRONT = 0;
const int LEFT = 1;
const int RIGHT = 2;
// ID's voor fotodiodes:
const int FRONT_LEFT = 0;
const int FRONT_RIGHT = 1;
const int BACK_LEFT = 2;
const int BACK_RIGHT = 3;
// Variabelen voor fotodiodes lezen:
int PHOTO_Front_Left;
int PHOTO_Front_Right;
int PHOTO_Back_Left;
int PHOTO_Back_Right;
const int SONAR_TrigSig = 10; // Duur (in µs) van triggersignaal voor ultrasoon (al gespecificeerd door product, niet wijzigen).
const unsigned long SONAR_MaxEc = 50000; // Maximale duur (in µs) van echo-signaal (al gespecificeerd door product, niet wijzigen).
const float SOUND_speed = 0.034; // Geluidssnelheid in lucht in cm/µs (wetenschappelijk vastgelegd).
int distance[SONAR_sum]; // Resultaten van afstandsberekening.
// Declaratie van servo's:
Servo SERVO_shaft;
Servo SERVO_front_left;
Servo SERVO_front_right;
Servo SERVO_back_left;
Servo SERVO_back_right;
// Variabelen voor elke servo's hoeken:
int ANGLE_shaft = ANGLE_mid_Shaft;
int ANGLE_front_left = ANGLE_mid_FLeft;
int ANGLE_front_right = ANGLE_mid_FRight;
int ANGLE_back_left = ANGLE_mid_BLeft;
int ANGLE_back_right = ANGLE_mid_BRight;
// Hoekmanipulatie voor midden servo (shaft).
const int ANGLE_max_Shaft = ANGLE_mid_Shaft + ANGLE_sweep;
const int ANGLE_min_Shaft = ANGLE_mid_Shaft - ANGLE_sweep;
int ANGLE_sweep_val;
// Variabelen voor het vastleggen van huidige hoeken van elke servo:
int ANGLE_shaft_record;
int ANGLE_front_left_record;
int ANGLE_front_right_record;
int ANGLE_back_left_record;
int ANGLE_back_right_record;
// Variabelen voor servo-hoekcorrectie op basis van lichtdetectie:
int LIGHT_left;
int LIGHT_right;
// Variabelen voor servo-hoekcorrectie op basis van sonar-detectie:
int SONAR_left;
int SONAR_right;
// Diverse flags, tellers, records...
int ANGLE_prev;
int flag_shaft_reverse;
int flag_transition_rotate;
int flag_transition_start = 1;
int flag_rest = 0;
int flag_RUN_time = 0;
int rotate_random;
int counter_gait;
void setup() {
// Serial.begin(9600); // Voor debugging
SERVO_shaft.attach(2); // ***Horizontale (shaft) servo signaalpin op Arduino.
SERVO_front_left.attach(4); // ***Voor-links servo signaalpin.
SERVO_front_right.attach(3); // ***Voor-rechts servo signaalpin.
SERVO_back_left.attach(6); // ***Achter-links servo signaalpin.
SERVO_back_right.attach(5); // ***Achter-rechts servo signaalpin.
// Zet servo's op hun middenhoeken.
SERVO_shaft.writeMicroseconds(ANGLE_mid_Shaft);
SERVO_front_left.writeMicroseconds(ANGLE_mid_FLeft);
SERVO_front_right.writeMicroseconds(ANGLE_mid_FRight);
SERVO_back_left.writeMicroseconds(ANGLE_mid_BLeft);
SERVO_back_right.writeMicroseconds(ANGLE_mid_BRight);
// Pinnen instellen voor sonars, zowel pinMode als waarde.
for(SONAR_id = 0; SONAR_id < SONAR_sum; SONAR_id++) {
pinMode(PIN_trig[SONAR_id], OUTPUT);
pinMode(PIN_ec[SONAR_id], INPUT);
digitalWrite(PIN_trig[SONAR_id], LOW);
}
randomSeed(analogRead(5)); // Analog pin 5 voor willekeurige waarden later.
SONAR_READ_ALL(); // Initiële sonar-lezing.
SONAR_READ_ALL(); // Twee keer nodig voor eerste keer (waarom weet ik niet, maar nodig).
START(); // Zorgt dat welke poten omhoog zijn bij eerste stap willekeurig is.
delay(3000); // **Wacht even.
}
void loop() {
int state = random(0, 2);
if(state == 0) {
REST();
} else {
int randomSPEED = random(0, 3);
sweepSPEED = sweepSPEED_Rand[randomSPEED];
RUN();
flag_rest = 0;
}
}
void REST() {
if(flag_rest == 0) {
TRANSITION_GAIT();
flag_rest = 1;
}
delay(REST_time);
}
void RUN() {
unsigned long TIMER_state = millis();
while((millis() - TIMER_state) <= RUN_time) {
if(distance[FRONT] > distRotate) {
flag_RUN_time = 0;
while(flag_RUN_time == 0) {
FORWARD();
}
}
while(distance[FRONT] > distRetreat && distance[FRONT] <= distRotate) {
while(distance[LEFT] > distance[RIGHT]) {
ROTATE_LEFT_AVOID();
break;
}
while(distance[LEFT] < distance[RIGHT]) {
ROTATE_RIGHT_AVOID();
break;
}
while(distance[LEFT] == distance[RIGHT]) {
ROTATE_RANDOM_AVOID();
break;
}
}
while(distance[FRONT] <= distRetreat) {
RETREAT_AVOID();
}
}
}
/* ... (rest van de code: gait functies, transitie, lopen, draaien, sonar lezen, licht detectie, gedrag) ... */
De volledige code is te lang voor deze weergave. Raadpleeg de originele bron voor de complete sketch.
Schema's

Productieproces
- Arduino Digitale Dobbelsteen: Bouw Je Eigen LCD-willekeurige Getalgenerator
- Een Arduino Iron Man bouwen: onderdelen, sensoren en stapsgewijze handleiding
- Find Me: Slimme Item Locator met Arduino en Bluetooth
- Bouw een Functionele, Arduino-aangedreven 3D-geprinte Robotarm – Stap-voor-Stap Handleiding
- De massa van de aarde meten met Arduino: een stapsgewijze DIY-gids
- DIY Arduino Luchtbevochtiger Controller met Relais – Veilige Hoogspanningsopstelling
- NeoPixel Matrix Pong op Arduino Nano: Bouw je eigen neon Pong-spel
- Bouw een Aangepaste Arduino Joystick Stuurwiel voor Gaming
- Bouw een krachtige FM-radio ontvanger met Arduino en TEA5767 module
- Arduino 101: Bouw een teller met DHT11 sensor & LCD display
- Health Band: slimme weerebare assistant voor senioren