Industriële fabricage
Industrieel internet der dingen | Industriële materialen | Onderhoud en reparatie van apparatuur | Industriële programmering |
home  MfgRobots >> Industriële fabricage >  >> Manufacturing Technology >> Productieproces

WALTER - De Arduino Photovore Insect

Componenten en benodigdheden

SparkFun Arduino Pro Mini 328 - 5V/16MHz
× 1
Ultrasone sensor - HC-SR04 (algemeen)
× 3
Fotodiode
× 4
Weerstand 100k ohm
× 4
MG90S Metal Geared Micro Servo
× 5
Draagbaar powerpack voor smartphones (2 kanalen:1A en 2.1 A)
× 1

Benodigde gereedschappen en machines

Soldeerbout (algemeen)
Hot lijmpistool (algemeen)

Apps en online services

Arduino IDE

Over dit project

[Excuseer mijn Engels]

Ik hou echt van de populaire opstelling van 2 servo's arduino-insecten op Youtube. Als ik ernaar keek, herinner ik me altijd wat de robotjongens van BEAM deden lang voordat die opstelling favoriet werd. Deze mensen, die analoge robotfanaten zijn, deden het beter op het lopen dankzij een betere hoek tussen de twee motoren (microcore / bicore walker , enz.).

Naar mijn mening ziet geen van de eerder genoemde er echter levendiger uit dan VBug1.5 (ook bekend als Walkman) gemaakt door de grondlegger van beam robotic, Mark Tilden. Het gebruikt 5 motoren, daarom heeft het meer wendbaarheid.

Het maken van een eenvoudige BEAM-robot is niet moeilijk, maar het bouwen van zoiets ingewikkelds als VBug1.5 kan verontrustend zijn voor een elektronische beginner zoals ik. Dus toen ik besloot om zoiets als Tilden's bugs te maken, moest ik genoegen nemen met het arduino-platform, de gemakkelijkste keuze voor niet-ingenieurs (of in mijn geval, beschamend, een ingenieur-wannabe).

Als resultaat heb ik Walter . gemaakt , een 4-potige arduino-robot met 5 servo's. Je vraagt ​​​​je misschien af, als ik een look-alive bug-robot wilde maken, waarom ik dan niet met 8 of 12 servo's ging. Nou, ik dacht aan iets eenvoudigs dat ik kan doen om de meeste wendbaarheid te krijgen die ik kan hebben. Ik heb het over veel lijm gebruiken in plaats van lijsten maken.

GEDRAG

Net als veel andere Arduino-robots kan Walter obstakels vermijden met behulp van HC-SR04 ultrasone sensoren. Om karakter toe te voegen als een insect, Walter ook een fotovoor, betekent dat hij wordt aangetrokken door licht. Fotodiodes worden gebruikt om licht te detecteren. Er zijn willekeurige waarden gegenereerd in de Arduino-schets om Walter te laten beslissen wanneer hij wil stoppen om te rusten, en ook om zijn loopsnelheid willekeurig te veranderen (3 snelheden).

Toen ik begon, was het mijn bedoeling om tactknoppen onder elk van Walters voeten te hebben, zodat hij oppervlaktesensoren zou hebben. Maar de batterij (een draagbare powerbank voor smartphone) kost de servo's te veel gewicht. Ik weet dat tactknoppen bijna niets wegen om je zorgen te maken om gewicht toe te voegen, maar ironisch genoeg is het gewicht van de robot niet genoeg om de omgekeerde knoppen in te drukken.

Ik was van plan om Walter-versie 2 te maken met grotere servo's en deze knoppen vervolgens op te nemen als oppervlaktesensoren.

meer details

Code

  • WALTER.ino
WALTER.inoArduino
/*WALTER - THE 4-LEGGED PHOTOVORE Deze Arduino-schets is mijn poging om een ​​5-servo viervoetige (4-potige) robot te bouwen met de naam "WALTER". Om deze schets te gebruiken, moet u mogelijk enkele waarden wijzigen voor uw gemak of om aan te passen aan uw eigen hardware-instelling. Zoek (Ctrl + F) deze markeringen om gemakkelijk te zoeken welke waarden mogelijk moeten worden gewijzigd:- ****:Deze markeringen betekenen dat ze de middenpositie van servo's zijn en moeten worden gekalibreerd (uw robot potitioning van de benen wanneer het inactief is). - ***:Deze markeringen betekenen toewijzing van arduino-pinnen (sensoren en servo's verbinding met arduino). Raadpleeg dit wanneer u de robot bouwt. - ** :Deze markeringen betekenen dat de waarden optioneel kunnen worden gewijzigd volgens uw smaak (stapbreedte van de benen, hoeveel te draaien bij het waarnemen van licht/obstakel, enz.). Laat het gewoon zoals het is als je niet weet wat je aan het doen was. Je kunt deze schets op eigen risico gebruiken. schrijf naar de gepubliceerde broncode??Het punt is dat ik niet verantwoordelijk wil worden gehouden als er iets ergs is gebeurd toen je deze codes gebruikte.Veel plezier! Yohanes Martedi - 2015*/#include // ** ** Kalibreer de middenhoek van servo's (in microseconden omdat we de opdracht "xx.writeMicroseconds();" zullen gebruiken). Begin 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 =250 ANGLE_sweep // **Stel deze waarde in (in microseconden) om te bepalen hoe breed de servo's zullen vegen (stapbreedte van de benen). Een grotere waarde betekent een grotere zwaaihoek.const int ANGLE_res =10; // **Stel de servobewegingsresolutie (in microseconden) in op minimaal de standaard dode bandbreedte van de servo (hoogste resolutie) of meer (minder resolutie). Voorbeeld:SG90 servo dode bandbreedte is 10 microseconden.int sweepSPEED; // variabele om te bepalen hoe snel de servo's zullen vegen.int sweepSPEED_Rand [3] ={4, 6, 8}; // **Servosnelheid (loopsnelheid) verandert willekeurig in 3 modi. Stel de snelheid (in milliseconden) in voor elke modus. Kleinere waarde betekent sneller.const int ANGLE_turnMAX =ANGLE_sweep * 1.5; // **Stel deze waarde in om te bepalen hoeveel maximaal de bot naar het licht zal draaien. Grotere waarde betekent grotere turn.const int ANGLE_turnNARROW =ANGLE_sweep * 0.25; // **Stel deze waarde in om te bepalen hoeveel maximaal de bot zal draaien om objecten aan zijn zijkanten in een nauwe ruimte te vermijden. Grotere waarde betekent grotere turn.const int SONAR_sum =3; // Aantal gebruikte sonars.const int PHOTO_sum =4; // Aantal gebruikte fotodiodes.int PIN_trig [SONAR_sum] ={13, 11, 8}; // *** Stel arduino-pinnen in die zijn aangesloten op de triggerpinnen van ultrasone sensoren; {voor, links, rechts}.int PIN_ec[SONAR_sum] ={12, 10, 7}; // *** Stel arduino-pinnen in die zijn aangesloten op de echo-pinnen van ultrasone sensoren; {voor, links, rechts}.int PIN_PHOTO[PHOTO_sum] ={2, 3, 1, 0}; // *** Stel arduino analoge ingangspinnen in die zijn aangesloten op fotodiodes; {linksvoor, rechtsvoor, linksachter, rechtsachter}.const int distRotate =25; // **Configureer de minimumafstand (in cm) tussen de robot en het obstakel voordat de robot het vermijdt door te draaien.const int distRetreat =10; // **Configureer de minimumafstand (in cm) tussen de robot en het obstakel voordat de robot deze ontwijkt door zich terug te trekken.const int distTurn =20; // **Configureer de minimumafstand (in cm) tussen de robot en het obstakel voordat de robot deze ontwijkt door te draaien.const int counter_gait_max =8; // **Configureer hoeveel stappen de robot zal nemen om obstakels te vermijden (bij draaien of terugtrekken).// **Configureer hoe lang de bot rust &run (in milliseconden).const int RUN_time =25000;const int REST_time =3000;// 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 het triggersignaal dat de sensoren nodig hebben om ultrasoon geluid te produceren (reeds gespecificeerd door de producten, verander deze waarde niet).const unsigned long SONAR_MaxEc =50000; // Maximale duur (in S) van het echosignaal gegeven door de sensoren (reeds gespecificeerd door de producten, verander deze waarde niet).const float SOUND_speed =0.034; // De snelheid van geluid op lucht in S/cm (reeds gespecificeerd door sciene, avatar Aang is nodig om luchtbuigen te doen als deze waarde gewijzigd wil worden).int distance[SONAR_sum]; // Resultaten van de berekening van de afstand.// Ddeclaratie van servo's:Servo SERVO_shaft;Servo SERVO_front_left;Servo SERVO_front_right;Servo SERVO_back_left;Servo SERVO_back_right;// Variabelen voor de hoeken van elke servo:int ANGLE_shaft =ANGLE_intmid_Shaft; ANGLE_front_right =ANGLE_mid_FRight;int ANGLE_back_left =ANGLE_mid_BLeft;int ANGLE_back_right =ANGLE_mid_BRight;// Hoekmanipulatie voor middelste servo (as).const int ANGLE_max_Shaft =ANGLE_mid_Shaft_LE =ANGLE_mid_Shaft LE =weepval int ANG + ANGLE_sweep; 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 volgens lichtdetectie:int LIGHT_left;int LIGHT_right;// Variabelen voor detectie van variabelen volgens servosnar int SONAR_left;int SONAR_right;// Die dingen zoals vlaggen, tellers, records waarvan ik altijd niet zeker weet hoe ik het moet uitleggen. :(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 roterende_random;int counter_gait;void setup() {// Serial.begin (9600); // Serial. .je weet wel, controleren en debuggen.. SERVO_shaft.attach(2); // ***Stel de signaalpin van de horizontale (as) servo op Arduino in. SERVO_front_left.attach(4); // ***Stel linksvoor in servo's signaalpin op Arduino. SERVO_front_right.attach (3); // ***Stel de signaalpin van de servo rechtsvoor op Arduino in. SERVO_back_left.attach (6); // ***Stel de signaalpin van de servo linksachter in op arduino. SERVO_back_right.attach(5); // ***Stel de signaalpen van de servo rechtsachter op Arduino. // Zet de servo's klaar in 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); // Instelpen s voor sonars, zowel pinMode als value. for (SONAR_id =0; SONAR_id  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(); pauze; } while(distance[LEFT] =ANGLE_max_Shaft) { ANGLE_prev =ANGLE_shaft; ANGLE_shaft -=ANGLE_res; } else if (ANGLE_prev> ANGLE_shaft &&ANGLE_shaft> ANGLE_min_Shaft) { ANGLE_prev =ANGLE_shaft; ANGLE_shaft -=ANGLE_res; } else if (ANGLE_shaft <=ANGLE_min_Shaft) { ANGLE_prev =ANGLE_shaft; ANGLE_shaft +=ANGLE_res; } SERVO_shaft.writeMicroseconds(ANGLE_shaft);}void SHAFT_REVERSE() {if(ANGLE_prev  ANGLE_shaft) { ANGLE_prev =ANGLE_shaft - 1; }}/*================================EINDE VAN DE ASBEWEGING ================================*//*=====================================OVERGANG =====================================*/void TRANSITION_GAIT() { ANGLE_front_left_record =ANGLE_front_left; ANGLE_front_right_record =ANGLE_front_right; ANGLE_back_left_record =ANGLE_back_left; ANGLE_back_right_record =ANGLE_back_right; ANGLE_shaft_record =ANGLE_shaft; int vlag =HOOG; int-teller =0; while(vlag ==HOOG) { SCHACHT(); LIGHT_links =0; LIGHT_right =0; teller++; ANGLE_front_left =kaart (teller, 1, ((ANGLE_sweep * 2) / ANGLE_res), ANGLE_front_left_record, ANGLE_mid_FLeft); ANGLE_front_right =kaart (teller, 1, ((ANGLE_sweep * 2) / ANGLE_res), ANGLE_front_right_record, ANGLE_mid_FRight); ANGLE_back_left =kaart (teller, 1, ((ANGLE_sweep * 2) / ANGLE_res), ANGLE_back_left_record, ANGLE_mid_BLeft); ANGLE_back_right =kaart (teller, 1, ((ANGLE_sweep * 2) / ANGLE_res), ANGLE_back_right_record, ANGLE_mid_BRight); SERVO_shaft.writeMicroseconden(ANGLE_shaft); SERVO_front_left.writeMicroseconds(ANGLE_front_left); SERVO_front_right.writeMicroseconden(ANGLE_front_right); SERVO_back_left.writeMicroseconds(ANGLE_back_left); SERVO_back_right.writeMicroseconden(ANGLE_back_right); if (teller ==((ANGLE_sweep * 2) / ANGLE_res)) {vlag =LAAG; BEGIN(); flag_transition_rotate =0; } }}void TRANSITION_START() { if(ANGLE_shaft ==ANGLE_mid_Shaft || (ANGLE_shaft> ANGLE_mid_Shaft &&ANGLE_shaft> ANGLE_prev) || (ANGLE_shaft =ANGLE_mid_Shaft &&ANGLE_prev =ANGLE_mid_Shaft &&ANGLE_prev> ANGLE_shaft) { ANGLE_front_left =map(ANGLE_shaft, ANGLE_max_Shaft, ANGLE_mid_Shaft, ANGLE_mid_FLeft, ((ANGLE_mid_FLeft_left) -AR_sweep_links) -LE_sweep ANGLE_front_right =map (ANGLE_shaft, ANGLE_max_Shaft, ANGLE_mid_Shaft, ANGLE_mid_FRight, ((ANGLE_mid_FRight + ANGLE_sweep_val) + LIGHT_right + SONAR_right)); ANGLE_back_left =map (ANGLE_shaft, ANGLE_max_Shaft, ANGLE_mid_Shaft, ANGLE_mid_BLeft, ((ANGLE_mid_BLeft - ANGLE_sweep_val) + LIGHT_left + SONAR_left)); ANGLE_back_right =map (ANGLE_shaft, ANGLE_max_Shaft, ANGLE_mid_Shaft, ANGLE_mid_BRight, ((ANGLE_mid_BRight - ANGLE_sweep_val) - LIGHT_right - SONAR_right)); } else if(ANGLE_shaft  ANGLE_shaft) { ANGLE_front_left =map(ANGLE_shaft, ANGLE_mid_Shaft, ANGLE_min_Shaft, ((ANGLE_mid_FLeft + ANGLE_sweep_val) - LIGHT_links), - e ANGLE_front_right =map(ANGLE_shaft, ANGLE_mid_Shaft, ANGLE_min_Shaft, ((ANGLE_mid_FRight + ANGLE_sweep_val) + LIGHT_right + SONAR_right), ANGLE_mid_FRight); ANGLE_back_left =map(ANGLE_shaft, ANGLE_mid_Shaft, ANGLE_min_Shaft, ((ANGLE_mid_BLeft - ANGLE_sweep_val) + LIGHT_left + SONAR_left), ANGLE_mid_BLeft); ANGLE_back_right =map (ANGLE_shaft, ANGLE_mid_Shaft, ANGLE_min_Shaft, ((ANGLE_mid_BRight - ANGLE_sweep_val) - LIGHT_right - SONAR_right), ANGLE_mid_BRight); } else if(ANGLE_shaft =ANGLE_mid_Shaft &&ANGLE_prev =ANGLE_mid_Shaft &&ANGLE_prev> ANGLE_shaft) { ANGLE_front_left =map(ANGLE_shaft, ANGLE_max_Shaft, ANGLE_mid_Shaft, ANGLE_mid_FLeft, (ANGLE_mid_FLeft_val ANGLE_sweep); ANGLE_front_right =kaart (ANGLE_shaft, ANGLE_max_Shaft, ANGLE_mid_Shaft, ANGLE_mid_FRight, (ANGLE_mid_FRight + ANGLE_sweep_val)); ANGLE_back_left =map (ANGLE_shaft, ANGLE_max_Shaft, ANGLE_mid_Shaft, ANGLE_mid_BLeft, (ANGLE_mid_BLeft + ANGLE_sweep_val)); ANGLE_back_right =kaart (ANGLE_shaft, ANGLE_max_Shaft, ANGLE_mid_Shaft, ANGLE_mid_BRight, (ANGLE_mid_BRight - ANGLE_sweep_val)); } else if(ANGLE_shaft  ANGLE_shaft) { ANGLE_front_left =map(ANGLE_shaft, ANGLE_mid_Shaft, ANGLE_min_Shaft, (ANGLE_mid_FLeft - ANGLE_sweep_val), ANGLE_mid_FLeft); ANGLE_front_right =kaart (ANGLE_shaft, ANGLE_mid_Shaft, ANGLE_min_Shaft, (ANGLE_mid_FRight + ANGLE_sweep_val), ANGLE_mid_FRight); ANGLE_back_left =map (ANGLE_shaft, ANGLE_mid_Shaft, ANGLE_min_Shaft, (ANGLE_mid_BLeft + ANGLE_sweep_val), ANGLE_mid_BLeft); ANGLE_back_right =kaart (ANGLE_shaft, ANGLE_mid_Shaft, ANGLE_min_Shaft, (ANGLE_mid_BRight - ANGLE_sweep_val), ANGLE_mid_BRight); } else if(ANGLE_shaft  0.0) { SONAR_distance =SONAR_EcInterval * (SOUND_speed / 2.0); pauze; } while(SONAR_EcInterval ==0.0) { SONAR_distance =501.0; pauze; } return SONAR_distance;}/*=============================EINDE VAN ULTRASOON LEZING =============================*//*====================================LICHT DETECT ====================================*/void LIGHT_COMPARE_EXECUTE() {//PHOTO_FLeft_RAW =analogRead(PIN_PHOTO[FRONT_LEFT]); //PHOTO_FRight_RAW =analoog lezen (PIN_PHOTO[FRONT_RIGHT]); PHOTO_Front_Left =analoog lezen (PIN_PHOTO[FRONT_LEFT]); PHOTO_Front_Right =analoog lezen (PIN_PHOTO[FRONT_RIGHT]); PHOTO_Back_Left =analoog lezen (PIN_PHOTO[BACK_LEFT]); PHOTO_Back_Right =analoog lezen (PIN_PHOTO[BACK_RIGHT]); if((PHOTO_Front_Left + PHOTO_Front_Right)>=(PHOTO_Back_Left + PHOTO_Back_Right)) { int LIGHT_Sensitivity =50; if(LIGHT_COMPARE()> LIGHT_Sensitivity) { LIGHT_left =LIGHT_COMPARE(); LIGHT_right =0; } else if(LIGHT_COMPARE() <-LIGHT_Sensitivity) { LIGHT_left =0; LIGHT_right =LIGHT_COMPARE(); } else { LIGHT_left =0; LIGHT_right =0; } } else { if(PHOTO_Back_Left> PHOTO_Back_Right) { LIGHT_right =0; LIGHT_left =ANGLE_turnMAX; } else if(PHOTO_Back_Left  PHOTO_Front_Right) { LIGHT_rate =PHOTO_Front_Left; } else if(PHOTO_Front_Right> PHOTO_Front_Left) { LIGHT_rate =PHOTO_Front_Right; } else { // kies ervoor om er een te gebruiken en becommentarieert de andere van deze variabelen hieronder // LIGHT_rate =PHOTO_Front_Left; LIGHT_rate =PHOTO_Front_Rechts; } int LIGHT_compareRAW =PHOTO_Front_Left - PHOTO_Front_Right; LIGHT_compareRAW =kaart (LIGHT_compareRAW, -LIGHT_rate, LIGHT_rate, -ANGLE_turnMAX, ANGLE_turnMAX);; return LIGHT_compareRAW;}/*=================================EINDE LICHT DETECTEREN =================================*//*======================================GEDRAG ======================================*/void RETREAT_AVOID() {counter_gait =0; while(counter_gait <=counter_gait_max) { RETREAT(); }} ongeldig ROTATE_LEFT_AVOID() { counter_gait =0; roteer_willekeurig =2; while(counter_gait <=counter_gait_max) { ROTATE_LEFT(); }} ongeldig ROTATE_RIGHT_AVOID() { counter_gait =0; roteer_willekeurig =2; while(counter_gait <=counter_gait_max) { ROTATE_RIGHT(); }}nietig ROTATE_RANDOM_AVOID() {rotate_random =ROTATE_RANDOM(); while(rotate_random ==0) { ROTATE_LEFT_AVOID(); } while(rotate_random ==1) { ROTATE_RIGHT_AVOID(); }}void SIDE_AVOID() { if(distance[LEFT] <=distTurn &&distance[RIGHT]> distTurn) { LIGHT_left =0; LIGHT_right =0; SONAR_links =0; SONAR_right =-(map(distance[LEFT], 0, distTurn, ANGLE_turnMAX, 0)); } else if(distance[RIGHT] <=distTurn &&distance[LEFT]> distTurn) { LIGHT_left =0; LIGHT_right =0; SONAR_rechts =0; SONAR_left =map(distance[RIGHT], 0, distTurn, ANGLE_turnMAX, 0); } else if(distance[LEFT] <=distTurn &&distance[RIGHT] <=distTurn) { LIGHT_left =0; LIGHT_right =0; if (afstand [LINKS]   

Schema's


Productieproces

  1. Arduino digitale dobbelstenen
  2. Iron Man
  3. Vind mij
  4. Arduino 3D-geprinte robotarm
  5. Hoe de massa van de aarde te meten met Arduino
  6. Arduino-luchtbevochtigerbediening
  7. NeoMatrix Arduino Pong
  8. Arduino-joystick
  9. Arduino TEA5767 FM-radio-ontvanger
  10. Stappenteller (Arduino 101)
  11. Health Band - Een slimme assistent voor ouderen