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

Arduino Spider Robot (Quadruped)

Componenten en benodigdheden

Arduino Nano R3
× 1
Bluetooth Low Energy (BLE)-module (algemeen)
× 1
Onion Corporation OLED-uitbreiding
× 1
RGB diffuse gemeenschappelijke kathode
× 1
JLCPCB aangepaste PCB
× 1

Over dit project

Hallo jongens! Hier is een nieuwe tutorial om je stap voor stap te begeleiden bij het maken van dit soort super verbazingwekkende elektronische projecten, de "crawler robot", ook wel bekend als een "spider robot" of een "quadruped robot".

Omdat iedereen de snelle evolutie van robottechnologie opmerkte, hebben we besloten jullie naar een hoger niveau te tillen op het gebied van robotica en het maken van robots. we zijn een tijdje geleden begonnen met het maken van een paar elektronische basisprojecten en een basisrobot zoals PICTO92 de lijnvolgerrobot om je een beetje vertrouwd te maken met de elektronische dingen en je eigen projecten te kunnen bedenken.

We gaan naar een ander niveau en we zijn begonnen met deze robot, die een basis is in het concept, maar het zal een beetje ingewikkeld worden als je dieper in het programma gaat. En aangezien deze gadgets zo duur zijn in de webwinkel bieden we deze stap voor stap begeleiding om jullie te begeleiden bij het maken van je eigen Spiderbot .

Dit project is zo handig om speciaal te maken nadat we de aangepaste PCB hebben gekregen die we bij JLCPCB hebben besteld om het uiterlijk van onze robot te verbeteren en er zijn ook voldoende documenten en codes in deze handleiding om u in staat te stellen eenvoudig uw crawler te maken.

We hebben dit project in slechts 7 dagen gemaakt, slechts twee dagen om de hardware te maken en in elkaar te zetten, en vervolgens vijf dagen om de code en de Android-app voor te bereiden. om de robot erdoorheen te sturen. Laten we eerst kijken voordat we beginnen

Wat je gaat leren:

  • De juiste componenten selecteren afhankelijk van de projectfunctionaliteiten
  • Het circuit maken om alle gekozen componenten te verbinden
  • Alle projectonderdelen in elkaar zetten
  • Schaalverdeling van de robotbalans
  • De Android-app gebruiken. om verbinding te maken via Bluetooth en het systeem te gaan manipuleren

Stap 1:Wat is een "Spider Robot?"

Zoals de naam het definieert, is onze robot een basisweergave van de sipderbewegingen, maar hij zal niet precies dezelfde lichaamsbewegingen uitvoeren omdat we slechts vier poten gebruiken in plaats van acht poten.

Ook wel een Quadruped . genoemd robot omdat hij vier poten heeft en zijn bewegingen maakt met deze benen, is de beweging van elk been gerelateerd aan de andere benen om de positie van het robotlichaam te identificeren en ook om de lichaamsbalans van de robot te regelen.

Robots met poten kunnen het terrein beter aan dan hun tegenhangers op wielen en bewegen op gevarieerde en dierlijke manieren. Dit maakt robots met poten echter ingewikkelder en minder toegankelijk voor veel makers. en ook de kosten voor het maken en de hoge kosten die een maker moet uitgeven om een ​​viervoeter te maken, omdat het gebaseerd is op servomotoren of stappenmotoren en beide duurder zijn dan gelijkstroommotoren die in robots op wielen zouden kunnen worden gebruikt.

Voordelen

Je zult in de natuur veel viervoeters vinden, omdat vier poten zorgen voor passieve stabiliteit, of het vermogen om te blijven staan ​​zonder actief de positie aan te passen. Hetzelfde geldt voor robots. Een robot met vier poten is goedkoper en eenvoudiger dan een robot met meer benen, maar kan toch stabiliteit bereiken.

Stap 2:servomotoren zijn de belangrijkste actuatoren

Een servomotor zoals gedefinieerd in wikipedia, is een roterende actuator of lineaire actuator die nauwkeurige regeling van hoekige of lineaire positie, snelheid en versnelling mogelijk maakt. [1]Het bestaat uit een geschikte motor die is gekoppeld aan een sensor voor positiefeedback. Het vereist ook een relatief geavanceerde controller, vaak een speciale module die speciaal is ontworpen voor gebruik met servomotoren.

Servomotoren zijn geen specifieke motorklasse, hoewel de term servomotor vaak wordt gebruikt om te verwijzen naar een motor die geschikt is voor gebruik in een gesloten regelsysteem.

In het algemeen is het stuursignaal een blokgolfpulstrein. Gebruikelijke frequenties voor stuursignalen zijn 44 Hz, 50 Hz en 400 Hz. De positieve pulsbreedte bepaalt de servopositie. Een positieve pulsbreedte van ongeveer 0,5 ms zorgt ervoor dat de servohoorn zoveel mogelijk naar links afbuigt (in het algemeen ongeveer 45 tot 90 graden, afhankelijk van de servo in kwestie). Een positieve pulsbreedte van ongeveer 2,5 ms tot 3,0 ms zorgt ervoor dat de servo zo ver mogelijk naar rechts afbuigt. Een pulsbreedte van ongeveer 1,5 ms zorgt ervoor dat de servo de neutrale positie op 0 graden houdt. De hoge uitgangsspanning is over het algemeen iets tussen 2,5 volt en 10 volt (met 3V typisch). De lage uitgangsspanning varieert van -40mV tot 0V.

Stap 3:Het maken van PCB's (geproduceerd door JLCPCB)

Over JLCPCB

JLCPCB (Shenzhen JIALICHUANG Electronic Technology Development Co., Ltd.), is de grootste onderneming voor PCB-prototypes in China en een hightechfabrikant die gespecialiseerd is in snelle PCB-prototypes en de productie van PCB's in kleine batches.

Met meer dan 10 jaar ervaring in PCB-productie, heeft JLCPCB meer dan 200.000 klanten in binnen- en buitenland, met meer dan 8.000 online bestellingen van PCB-prototyping en kleine hoeveelheden PCB-productie per dag. De jaarlijkse productiecapaciteit is 200.000 m². voor diverse 1-laags, 2-laags of meerlaags PCB's. JLC is een professionele PCB-fabrikant die wordt gekenmerkt door grootschalige, bronapparatuur, strikt beheer en superieure kwaliteit.

Terug naar ons project

Om de PCB te produceren, heb ik de prijs van veel PCB-producenten vergeleken en ik koos JLCPCB de beste PCB-leveranciers en de goedkoopste PCB-leveranciers om dit circuit te bestellen. Het enige wat ik hoef te doen is een paar simpele klikken om het gerber-bestand te uploaden en een aantal parameters in te stellen, zoals de kleur en hoeveelheid van de PCB-dikte, dan heb ik slechts 2 dollar betaald om mijn PCB na slechts vijf dagen te krijgen.

Omdat het de afbeelding van het gerelateerde schema laat zien, heb ik een Arduino Nano gebruikt om het hele systeem te besturen. Ik heb ook de vorm van de robotspin ontworpen om dit project veel beter te maken.

U kunt het Circuit-bestand (PDF) hier downloaden. Zoals je op de foto's hierboven kunt zien, is de PCB zeer goed vervaardigd en heb ik dezelfde PCB-spinvorm die we hebben ontworpen en alle labels en logo's zijn er om me te begeleiden tijdens de soldeerstappen.

U kunt hier ook het Gerber-bestand voor dit circuit downloaden voor het geval u een bestelling wilt plaatsen voor hetzelfde circuitontwerp.

Stap 4:Ingrediënten

Laten we nu eens kijken naar de benodigde componenten die we nodig hebben voor dit project, dus zoals ik al zei, ik gebruik een Arduino Nano om alle 12 servomotoren van de robot vier poten te laten draaien. Het project omvat ook een OLED-display om de Cozmo-gezichten weer te geven en een bluetooth-module om de robot via een Android-app te besturen.

Om dit soort projecten te maken hebben we nodig:

  • - De PCB die we bij JLCPCB hebben besteld
  • - 12 servomotoren zoals je je herinnert 3 servo's voor elke poot:https://amzn.to/2B25XbG
  • - Eén Arduino Nano:https://amzn.to/2MmZsVg
  • - HC-06 Bluetooth-module:https://amzn.to/2B1Z3CY
  • - Eén OLED-scherm:https://amzn.to/2OySnyn
  • - 5 mm RGB-leds:https://amzn.to/2B56hq3
  • - Enkele header-verbindingen:https://amzn.to/2nyZg7i
  • - En het robotlichaam kalmeert dat je ze moet afdrukken met een 3D-printer

Stap 5:De robot assembleert

Nu hebben we de PCB klaar en alle componenten zijn heel goed gesoldeerd, daarna moeten we het robotlichaam monteren, de procedure is zo eenvoudig, dus volg gewoon de stappen die ik laat zien, we moeten eerst elk been een kant voorbereiden en maken één led hebben we twee servomotoren nodig voor de gewrichten en de Coxa, Femur en Tibia geprinte delen met dit kleine bevestigingsdeel.

Over de lichaamsdelen van de robot kun je de STL-bestanden hier downloaden.

Begin met de eerste servo, plaats deze in de houder en houd hem vast met zijn schroeven, draai daarna de servo's-bijl naar 180° zonder de schroef voor de bevestigingen te plaatsen en ga naar het volgende deel, het dijbeen om het aan te sluiten op het scheenbeen met behulp van de eerste servoverbindingsbijl en het bevestigingsstuk. De laatste stap om het been te voltooien, is het plaatsen van het tweede gewricht, ik bedoel de tweede servo om het derde deel van het been, het Coxa-stuk, vast te houden.

Herhaal nu hetzelfde voor alle benen om vier benen klaar te maken. Neem daarna het bovenste chassis en plaats de rest van de servo's in de bussen en sluit vervolgens elke poot aan op de juiste servo. Er is slechts één laatste afgedrukt deel, namelijk het onderste robotchassis waarin we onze printplaat zullen plaatsen

Stap 6:De Android-app

Praten over de Android-up, het stelt je in staat om

maak via Bluetooth verbinding met uw robot en maak voor- en achterwaartse bewegingen en links-rechts draaien, het stelt u ook in staat om de lichtkleur van de robot in realtime te regelen door de gewenste kleur uit dit kleurenwiel te kiezen.

U kunt de Android-app gratis downloaden via deze link:hier

Stap 7:De Arduino-code en testvalidatie

Nu hebben we de robot bijna klaar om te draaien, maar we moeten eerst de verbindingshoeken instellen, dus upload de setup-code waarmee je elke servo in de juiste positie kunt zetten door de servo's in 90 graden te bevestigen. Vergeet niet om de 7V aan te sluiten DC-batterij om de robot te laten werken.

Vervolgens moeten we het hoofdprogramma uploaden om de robot te besturen met behulp van de Android-app. Beide programma's kunt u downloaden via deze links:

- Servocode schalen:downloadlink- Hoofdprogramma Spider robot:downloadlink

Na het uploaden van de code heb ik het OLED-display aangesloten om de Cozmo-robotglimlachen weer te geven die ik in de hoofdcode heb gemaakt.

Zoals je kunt zien op de bovenstaande foto's, volgt de robot alle instructies die vanaf mijn smartphone zijn verzonden en nog enkele andere verbeteringen om uit te voeren om het veel beter te maken.

Code

  • Hoofdcode Spider Robot
Hoofdcode Spider RobotArduino
/************************************************** ********************************************** ********************************************** ********************* * - Auteur :BELKHIR Mohamed * * - Beroep :(Electrical Ingineer) MEGA DAS eigenaar * * - Hoofddoel :Industriële toepassing * * - Copyright (c) houder :Alle rechten voorbehouden * * - Licentie :BSD 2-Clause Licentie * * - Datum :20/04/2017 * * ********************* ********************************************** ********************************************** **********************************************/ /*********************************** NOTITIE ************* *************************/// Herdistributie en gebruik in bron- en binaire vorm, met of zonder// wijziging, is toegestaan ​​op voorwaarde dat het volgende voorwaarden is voldaan:// * Herdistributies van broncode moeten de bovenstaande copyrightvermelding, deze// lijst met voorwaarden en de volgende disclaimer bevatten.// * Herdistributies in binaire vorm moeten reproduceren ce de bovenstaande copyrightvermelding,// deze lijst met voorwaarden en de volgende disclaimer in de documentatie// en/of ander materiaal dat bij de distributie wordt geleverd.// DEZE SOFTWARE WORDT GELEVERD DOOR DE HOUDERS EN BIJDRAGERS VAN HET AUTEURSRECHT "AS IS"// EN ELKE UITDRUKKELIJKE OF IMPLICIETE GARANTIES, INCLUSIEF, MAAR NIET BEPERKT TOT, DE// IMPLICIETE GARANTIES VAN VERKOOPBAARHEID EN GESCHIKTHEID VOOR EEN BEPAALD DOEL WORDEN AFGEWEZEN/* */#include  //om servosi#include //om een ​​timer in te stellen om alle servo's te beheren#include #include #include // OLED-display TWI-adres#define OLED_ADDR 0x3CAdafruit_SSD1306 display(-1); /* Servo's ----------------------------------------------- ---------------------*///definieer 12 servo's voor 4 potenServo servo[4][3];//definieer de poorten van servo's int servo_pin[4] [3] ={ {11, 12, 13}, {2, 4, 7}, {14, 15, 16},{8, 9, 10} };/* Grootte van de robot ------ -------------------------------------------------- -*/const float l ength_a =50;const float length_b =77.1;const float length_c =27.5;const float length_side =71;const float z_absolute =-28;/* Constanten voor beweging ---------------- ------------------------------------*/const float z_default =-50, z_up =-30, z_boot =z_absolute;const float x_default =62, x_offset =0;const float y_start =0, y_step =40;const float y_default =x_default;/* variabelen voor beweging --------------- -------------------------------------*/vluchtige float site_now[4][3]; // realtime coördinaten van het einde van elke legvolatile float site_expect [4][3]; // verwachte coördinaten van het einde van elke legfloat temp_speed [4][3]; //de snelheid van elke as moet herberekend worden voor elke motionfloat move_speed; // beweging speedfloat speed_multiple =1; // bewegingssnelheid multipleconst float spot_turn_speed =4;const float leg_move_speed =8;const float body_move_speed =3;const float stand_seat_speed =1;vluchtige int rest_counter; //+1/0.02s, voor automatische rust//functies' parameterconst float KEEP =255;//define PI voor berekeningconst float pi =3.1415926;/* Constanten voor draaien ------------- -------------------------------------------*///temp lengthconst float temp_a =sqrt(pow(2 * x_default + length_side, 2) + pow(y_step, 2));const float temp_b =2 * (y_start + y_step) + length_side;const float temp_c =sqrt(pow(2 * x_default + length_side , 2) + pow(2 * y_start + y_step + length_side, 2));const float temp_alpha =acos((pow(temp_a, 2) + pow(temp_b, 2) - pow(temp_c, 2)) / 2 / temp_a / temp_b);//site voor turnconst float turn_x1 =(temp_a - length_side) / 2;const float turn_y1 =y_start + y_step / 2;const float turn_x0 =turn_x1 - temp_b * cos(temp_alpha);const float turn_y0 =temp_b * sin (temp_alpha) - turn_y1 - length_side;const int lightR=3;const int lightG=5;const int lightB=6;int LedR=0;int LedG=0;int LedB=0;char SerialData; // Gebruik deze variabele om elk karakter te lezen dat is ontvangen via seriële poortString data ="";void setup() { Serial.begin(9600); display.begin(SSD1306_SWITCHCAPVCC, OLED_ADDR); display.clearDisplay(); weergave.weergave(); vertraging (10000); set_site (0, x_default - x_offset, y_start + y_step, z_boot); set_site(1, x_default - x_offset, y_start + y_step, z_boot); set_site (2, x_default + x_offset, y_start, z_boot); set_site (3, x_default + x_offset, y_start, z_boot); for (int i =0; i <4; i++) { for (int j =0; j <3; j++) { site_now[i][j] =site_expect[i][j]; } } //start servo-service FlexiTimer2::set (20, servo_service); FlexiTimer2::start(); // initialiseer servo's servo_attach (); stand();// vertraging(3000);// sit();// vertraging(3000);// stand();// vertraging(3000); vrolijk(); vertraging (willekeurig (500, 1000)); cierra(); vertraging (150); enfado(); vertraging (willekeurig (1000, 3000)); cierra(); vertraging (150); entorna(); vertraging (willekeurig (1000, 3000)); cierra(); vertraging (150); enfado1(); vertraging (willekeurig (1000, 3000)); cierra(); vertraging (150); triste(); vertraging (willekeurig (1000, 3000)); cierra(); vertraging (150); abre(); vertraging (willekeurig (500, 3000)); cierra(); vertraging (150); vrolijk(); vertraging (willekeurig (500, 1000));}void loop() { while(Serial.available()) // Hoewel seriële gegevens beschikbaar zijn, slaan we deze op { delay(10); SerialData=Serial.read(); if(SerialData=='b') LedR=Serial.parseInt(); else if(SerialData=='g') LedG=Serial.parseInt(); else if(SerialData=='r') LedB=Serial.parseInt(); else data+=SerialData; } if(data=="f") // Als de opgeslagen gegevens voorwaartse beweging zijn {cierra(); vertraging (150); vrolijk(); step_forward(1); } if(data=="p") // Als de opgeslagen gegevens achterwaartse beweging zijn { cierra(); vertraging (150); triste(); step_back(1); } if(data=="l") // Als de opgeslagen gegevens de auto links moeten afslaan { cierra(); vertraging (150); enfado1(); turn_links(1); } if(data=="m") // Als de opgeslagen gegevens zijn om rechtsaf de auto { cierra(); vertraging (150); enfado(); turn_right(5); } gegevens=""; analoogWrite(lightR,LedR); analoogWrite(lightG,LedG); analogWrite(lightB,LedB);}void servo_attach(void){ for (int i =0; i <4; i++) { for (int j =0; j <3; j++) { servo[i][j]. attach(servo_pin[i][j]); vertraging (100); } }}void servo_detach(void){ for (int i =0; i <4; i++) { for (int j =0; j <3; j++) { servo[i][j].detach(); vertraging (100); } }}void sit(void){ move_speed =stand_seat_speed; for (int been =0; been <4; been++) { set_site(leg, KEEP, KEEP, z_boot); } wait_all_reach();}/* - stand - blokkeerfunctie ------------------------------------- --------------------------------------*/void stand(void){ move_speed =stand_seat_speed; for (int been =0; been <4; been++) { set_site(leg, KEEP, KEEP, z_default); } wait_all_reach();}/* - spot draai naar links - blokkeerfunctie - parameter stap stappen wilden draaien --------------------------- ------------------------------------------------*/ void turn_left (unsigned int step){ move_speed =spot_turn_speed; while (stap--> 0) {if (site_now[3][1] ==y_start) { //leg 3&1 move set_site (3, x_default + x_offset, y_start, z_up); wait_all_reach(); set_site (0, turn_x1 - x_offset, turn_y1, z_default); set_site(1, turn_x0 - x_offset, turn_y0, z_default); set_site (2, turn_x1 + x_offset, turn_y1, z_default); set_site (3, turn_x0 + x_offset, turn_y0, z_up); wait_all_reach(); set_site (3, turn_x0 + x_offset, turn_y0, z_default); wait_all_reach(); set_site(0, turn_x1 + x_offset, turn_y1, z_default); set_site(1, turn_x0 + x_offset, turn_y0, z_default); set_site (2, turn_x1 - x_offset, turn_y1, z_default); set_site (3, turn_x0 - x_offset, turn_y0, z_default); wait_all_reach(); set_site(1, turn_x0 + x_offset, turn_y0, z_up); wait_all_reach(); set_site (0, x_default + x_offset, y_start, z_default); set_site(1, x_default + x_offset, y_start, z_up); set_site (2, x_default - x_offset, y_start + y_step, z_default); set_site (3, x_default - x_offset, y_start + y_step, z_default); wait_all_reach(); set_site(1, x_default + x_offset, y_start, z_default); wait_all_reach(); } else { //leg 0&2 move set_site (0, x_default + x_offset, y_start, z_up); wait_all_reach(); set_site(0, turn_x0 + x_offset, turn_y0, z_up); set_site(1, turn_x1 + x_offset, turn_y1, z_default); set_site(2, turn_x0 - x_offset, turn_y0, z_default); set_site (3, turn_x1 - x_offset, turn_y1, z_default); wait_all_reach(); set_site (0, turn_x0 + x_offset, turn_y0, z_default); wait_all_reach(); set_site(0, turn_x0 - x_offset, turn_y0, z_default); set_site(1, turn_x1 - x_offset, turn_y1, z_default); set_site(2, turn_x0 + x_offset, turn_y0, z_default); set_site (3, turn_x1 + x_offset, turn_y1, z_default); wait_all_reach(); set_site(2, turn_x0 + x_offset, turn_y0, z_up); wait_all_reach(); set_site (0, x_default - x_offset, y_start + y_step, z_default); set_site(1, x_default - x_offset, y_start + y_step, z_default); set_site (2, x_default + x_offset, y_start, z_up); set_site (3, x_default + x_offset, y_start, z_default); wait_all_reach(); set_site (2, x_default + x_offset, y_start, z_default); wait_all_reach(); } }}/* - spot draai naar rechts - blokkeerfunctie - parameter stap stappen wilden draaien ------------------------------ ---------------------------------------------*/void turn_right( unsigned int step){ move_speed =spot_turn_speed; while (stap--> 0) {if (site_now[2][1] ==y_start) { //leg 2&0 move set_site (2, x_default + x_offset, y_start, z_up); wait_all_reach(); set_site(0, turn_x0 - x_offset, turn_y0, z_default); set_site(1, turn_x1 - x_offset, turn_y1, z_default); set_site(2, turn_x0 + x_offset, turn_y0, z_up); set_site (3, turn_x1 + x_offset, turn_y1, z_default); wait_all_reach(); set_site(2, turn_x0 + x_offset, turn_y0, z_default); wait_all_reach(); set_site (0, turn_x0 + x_offset, turn_y0, z_default); set_site(1, turn_x1 + x_offset, turn_y1, z_default); set_site(2, turn_x0 - x_offset, turn_y0, z_default); set_site (3, turn_x1 - x_offset, turn_y1, z_default); wait_all_reach(); set_site(0, turn_x0 + x_offset, turn_y0, z_up); wait_all_reach(); set_site (0, x_default + x_offset, y_start, z_up); set_site(1, x_default + x_offset, y_start, z_default); set_site (2, x_default - x_offset, y_start + y_step, z_default); set_site (3, x_default - x_offset, y_start + y_step, z_default); wait_all_reach(); set_site (0, x_default + x_offset, y_start, z_default); wait_all_reach(); } else { //leg 1&3 move set_site(1, x_default + x_offset, y_start, z_up); wait_all_reach(); set_site(0, turn_x1 + x_offset, turn_y1, z_default); set_site(1, turn_x0 + x_offset, turn_y0, z_up); set_site (2, turn_x1 - x_offset, turn_y1, z_default); set_site (3, turn_x0 - x_offset, turn_y0, z_default); wait_all_reach(); set_site(1, turn_x0 + x_offset, turn_y0, z_default); wait_all_reach(); set_site (0, turn_x1 - x_offset, turn_y1, z_default); set_site(1, turn_x0 - x_offset, turn_y0, z_default); set_site (2, turn_x1 + x_offset, turn_y1, z_default); set_site (3, turn_x0 + x_offset, turn_y0, z_default); wait_all_reach(); set_site (3, turn_x0 + x_offset, turn_y0, z_up); wait_all_reach(); set_site (0, x_default - x_offset, y_start + y_step, z_default); set_site(1, x_default - x_offset, y_start + y_step, z_default); set_site (2, x_default + x_offset, y_start, z_default); set_site (3, x_default + x_offset, y_start, z_up); wait_all_reach(); set_site (3, x_default + x_offset, y_start, z_default); wait_all_reach(); } }}/* - ga vooruit - blokkeerfunctie - parameter stap stappen wilden gaan -------------------------------- -------------------------------------------*/void step_forward(unsigned int stap){ move_speed =leg_move_speed; while (stap--> 0) {if (site_now[2][1] ==y_start) { //leg 2&1 move set_site (2, x_default + x_offset, y_start, z_up); wait_all_reach(); set_site (2, x_default + x_offset, y_start + 2 * y_step, z_up); wait_all_reach(); set_site (2, x_default + x_offset, y_start + 2 * y_step, z_default); wait_all_reach(); move_speed =body_move_speed; set_site (0, x_default + x_offset, y_start, z_default); set_site(1, x_default + x_offset, y_start + 2 * y_step, z_default); set_site (2, x_default - x_offset, y_start + y_step, z_default); set_site (3, x_default - x_offset, y_start + y_step, z_default); wait_all_reach(); move_speed =leg_move_speed; set_site (1, x_default + x_offset, y_start + 2 * y_step, z_up); wait_all_reach(); set_site(1, x_default + x_offset, y_start, z_up); wait_all_reach(); set_site(1, x_default + x_offset, y_start, z_default); wait_all_reach(); } else { //leg 0&3 move set_site (0, x_default + x_offset, y_start, z_up); wait_all_reach(); set_site (0, x_default + x_offset, y_start + 2 * y_step, z_up); wait_all_reach(); set_site (0, x_default + x_offset, y_start + 2 * y_step, z_default); wait_all_reach(); move_speed =body_move_speed; set_site (0, x_default - x_offset, y_start + y_step, z_default); set_site(1, x_default - x_offset, y_start + y_step, z_default); set_site (2, x_default + x_offset, y_start, z_default); set_site (3, x_default + x_offset, y_start + 2 * y_step, z_default); wait_all_reach(); move_speed =leg_move_speed; set_site (3, x_default + x_offset, y_start + 2 * y_step, z_up); wait_all_reach(); set_site (3, x_default + x_offset, y_start, z_up); wait_all_reach(); set_site (3, x_default + x_offset, y_start, z_default); wait_all_reach(); } }}/* - ga terug - blokkeerfunctie - parameter stap stappen wilden gaan -------------------------------- -------------------------------------------*/void step_back (unsigned int stap){ move_speed =leg_move_speed; while (stap--> 0) {if (site_now[3][1] ==y_start) { //leg 3&0 move set_site (3, x_default + x_offset, y_start, z_up); wait_all_reach(); set_site (3, x_default + x_offset, y_start + 2 * y_step, z_up); wait_all_reach(); set_site (3, x_default + x_offset, y_start + 2 * y_step, z_default); wait_all_reach(); move_speed =body_move_speed; set_site (0, x_default + x_offset, y_start + 2 * y_step, z_default); set_site(1, x_default + x_offset, y_start, z_default); set_site (2, x_default - x_offset, y_start + y_step, z_default); set_site (3, x_default - x_offset, y_start + y_step, z_default); wait_all_reach(); move_speed =leg_move_speed; set_site (0, x_default + x_offset, y_start + 2 * y_step, z_up); wait_all_reach(); set_site (0, x_default + x_offset, y_start, z_up); wait_all_reach(); set_site (0, x_default + x_offset, y_start, z_default); wait_all_reach(); } else { //leg 1&2 move set_site(1, x_default + x_offset, y_start, z_up); wait_all_reach(); set_site (1, x_default + x_offset, y_start + 2 * y_step, z_up); wait_all_reach(); set_site(1, x_default + x_offset, y_start + 2 * y_step, z_default); wait_all_reach(); move_speed =body_move_speed; set_site (0, x_default - x_offset, y_start + y_step, z_default); set_site(1, x_default - x_offset, y_start + y_step, z_default); set_site (2, x_default + x_offset, y_start + 2 * y_step, z_default); set_site (3, x_default + x_offset, y_start, z_default); wait_all_reach(); move_speed =leg_move_speed; set_site (2, x_default + x_offset, y_start + 2 * y_step, z_up); wait_all_reach(); set_site (2, x_default + x_offset, y_start, z_up); wait_all_reach(); set_site (2, x_default + x_offset, y_start, z_default); wait_all_reach(); } }}// toevoegen door RegisHsuvoid body_left(int i){ set_site(0, site_now[0][0] + i, KEEP, KEEP); set_site(1, site_now[1][0] + i, KEEP, KEEP); set_site(2, site_now[2][0] - i, KEEP, KEEP); set_site (3, site_now [3][0] - i, KEEP, KEEP); wait_all_reach();}void body_right(int i){ set_site(0, site_now[0][0] - i, KEEP, KEEP); set_site(1, site_now[1][0] - i, KEEP, KEEP); set_site(2, site_now[2][0] + i, KEEP, KEEP); set_site (3, site_now [3][0] + i, KEEP, KEEP); wait_all_reach();}void hand_wave(int i){ float x_tmp; zweven y_tmp; zweven z_tmp; move_speed =1; if (site_now[3][1] ==y_start) { body_right (15); x_tmp =site_nu[2][0]; y_tmp =site_nu[2][1]; z_tmp =site_nu[2][2]; move_speed =body_move_speed; for (int j =0; j  i / 4)// move_speed =body_dance_speed * 2;// if (j> i / 2)// move_speed =body_dance_speed * 3;/ / set_site (0, KEEP, y_default - 20, KEEP);// set_site (1, KEEP, y_default + 20, KEEP);// set_site (2, KEEP, y_default - 20, KEEP);// set_site (3, KEEP, y_default + 20, KEEP);// wait_all_reach();// set_site (0, KEEP, y_default + 2 0, KEEP);// set_site (1, KEEP, y_default - 20, KEEP);// set_site (2, KEEP, y_default + 20, KEEP);// set_site (3, KEEP, y_default - 20, KEEP); // wait_all_reach();// }// move_speed =body_dance_speed;// head_down(30);//}/* - microservos-service /timer-onderbrekingsfunctie/50Hz - wanneer de locatie wordt verwacht, verplaatst deze functie het eindpunt ernaartoe in een rechte lijn - temp_speed[4][3] moet worden ingesteld voordat de verwachte site wordt ingesteld, het zorgt ervoor dat het eindpunt in een rechte lijn beweegt en bepaalt de verplaatsingssnelheid. -------------------------------------------------- -------------------------*/void servo_service(void){ sei(); statische vlotter alfa, bèta, gamma; for (int i =0; i <4; i++) { for (int j =0; j <3; j++) { if (abs(site_now[i][j] - site_expect[i][j])>=abs(temp_speed[i][j])) site_now[i][j] +=temp_speed[i][j]; else site_now[i][j] =site_expect[i][j]; } cartesian_to_polar(alpha, beta, gamma, site_now[i][0], site_now[i][1], site_now[i][2]); polar_to_servo(i, alfa, bèta, gamma); } rest_counter++;}/* - stel een van de verwachte eindpunten in - deze functie stelt tegelijkertijd temp_speed[4][3] in - niet-blokkerende functie --------------- -------------------------------------------------- ----------*/void set_site(int leg, float x, float y, float z){ float length_x =0, length_y =0, length_z =0; if (x !=KEEP) length_x =x - site_now[leg][0]; if (y !=KEEP) length_y =y - site_now[leg][1]; if (z !=KEEP) length_z =z - site_now[leg][2]; float length =sqrt(pow(length_x, 2) + pow(length_y, 2) + pow(length_z, 2)); temp_speed[leg][0] =length_x / length * move_speed * speed_multiple; temp_speed[leg][1] =length_y / length * move_speed * speed_multiple; temp_speed[leg][2] =length_z / length * move_speed * speed_multiple; if (x !=KEEP) site_expect[leg][0] =x; if (y !=KEEP) site_expect[leg][1] =y; if (z !=KEEP) site_expect[leg][2] =z;}/* - wait one of end points move to expect site - blocking function ---------------------------------------------------------------------------*/void wait_reach(int leg){ while (1) if (site_now[leg][0] ==site_expect[leg][0]) if (site_now[leg][1] ==site_expect[leg][1]) if (site_now[leg][2] ==site_expect[leg][2]) break;}/* - wait all of end points move to expect site - blocking function ---------------------------------------------------------------------------*/void wait_all_reach(void){ for (int i =0; i <4; i++) wait_reach(i);}/* - trans site from cartesian to polar - mathematical model 2/2 ---------------------------------------------------------------------------*/void cartesian_to_polar(volatile float &alpha, volatile float &beta, volatile float &gamma, volatile float x, volatile float y, volatile float z){ //calculate w-z degree float v, w; w =(x>=0 ? 1 :-1) * (sqrt(pow(x, 2) + pow(y, 2))); v =w - length_c; alpha =atan2(z, v) + acos((pow(length_a, 2) - pow(length_b, 2) + pow(v, 2) + pow(z, 2)) / 2 / length_a / sqrt(pow(v, 2) + pow(z, 2))); beta =acos((pow(length_a, 2) + pow(length_b, 2) - pow(v, 2) - pow(z, 2)) / 2 / length_a / length_b); //calculate x-y-z degree gamma =(w>=0) ? atan2(y, x) :atan2(-y, -x); //trans degree pi->180 alpha =alpha / pi * 180; beta =beta / pi * 180; gamma =gamma / pi * 180;}/* - trans site from polar to microservos - mathematical model map to fact - the errors saved in eeprom will be add ---------------------------------------------------------------------------*/void polar_to_servo(int leg, float alpha, float beta, float gamma){ if (leg ==0) { alpha =90 - alpha; beta =beta; gamma +=90; } else if (leg ==1) { alpha +=90; beta =180 - beta; gamma =90 - gamma; } else if (leg ==2) { alpha +=90; beta =180 - beta; gamma =90 - gamma; } else if (leg ==3) { alpha =90 - alpha; beta =beta; gamma +=90; } servo[leg][0].write(alpha); servo[leg][1].write(beta); servo[leg][2].write(gamma);}void abre() { display.clearDisplay(); display.fillCircle (50, 15, 12, WHITE); //ojo izquierdo grande display.fillCircle (82, 20, 7, WHITE); //ojo derecho pequeo display.display();}void cierra() { display.clearDisplay(); display.drawFastHLine(40, 15, 20, WHITE); display.drawFastHLine(72, 20, 15, WHITE); display.display();}void entorna() { display.clearDisplay(); display.fillCircle (42, 10, 20, WHITE); //ojo izquierdo grande display.fillCircle (82, 10, 15, WHITE); //ojo derecho pequeo display.fillRect (0, 0, 128, 15, BLACK); //ceja superior display.fillRect (0, 40, 128, 15, BLACK); //ceja inferior display.display();}void triste() { display.clearDisplay(); display.fillCircle (42, 10, 17, WHITE); //ojo izquierdo grande display.fillCircle (82, 10, 17, WHITE); //ojo derecho pequeo display.fillTriangle (0, 0, 0, 35, 78, 0, BLACK); //ceja superior display.fillTriangle (50, 0, 128, 35, 128, 0, BLACK); //ceja superior display.display();}void happy() { display.clearDisplay(); display.fillCircle (42, 25, 15, WHITE); //ojo izquierdo grande display.fillCircle (82, 25, 15, WHITE); //ojo derecho pequeo display.fillCircle (42, 33, 20, BLACK); //ojo izquierdo grande display.fillCircle (82, 33, 20, BLACK); //ojo derecho pequeo display.display();}void enfado() { display.clearDisplay(); display.fillCircle (42, 10, 18, WHITE); //ojo izquierdo grande display.fillCircle (82, 10, 12, WHITE); //ojo derecho pequeo display.fillTriangle (0, 0, 54, 26, 118, 0, BLACK); //ceja superior display.display();}void enfado1() { display.clearDisplay(); display.fillCircle (42, 10, 18, WHITE); //ojo izquierdo grande display.fillCircle (82, 10, 12, WHITE); //ojo derecho pequeo display.fillTriangle (0, 0, 65, 15, 120, 0, BLACK); //ceja superior display.display();}

Aangepaste onderdelen en behuizingen

Schema's


Productieproces

  1. Persoonlijke robotassistenten alomtegenwoordig maken
  2. Raspberry Pi-robot bestuurd via Bluetooth
  3. JQR Quadruped Autonomous Robot
  4. Obstakels vermijden robot met servomotor
  5. Lijnvolger Robot
  6. Spraakgestuurde robot
  7. Arduino Quadruped
  8. Arduino-gestuurde pianorobot:PiBot
  9. Littlearm 2C:bouw een 3D-geprinte Arduino-robotarm
  10. Autonome Home Assistant-robot
  11. Robot voor supercoole indoornavigatie