Robotarakan Petya für zehn Dollar

Treffen Sie Petya, die sechsbeinigen drei Servos


Ich veröffentliche weiterhin Artikel aus der Arduino Brain-Reihe. Petja ist ein sehr billiger Hexapod (ungefähr zehn Dollar). Es kann ein wunderbares Projekt für einen regnerischen freien Tag sein, der sowohl Erwachsene als auch Kinder unterhalten wird. Da es sich um Unterhaltung handelt, gibt es hier ein Video, in dem Petya zu Funkmusik tanzt:



Natürlich habe ich keine Klanganalyse durchgeführt, sondern Petya einfach so programmiert, dass sie in einem bestimmten Rhythmus tanzt. Hier ist ein weiteres Video, in dem Petja seine Verachtung für das Jonglieren von Bällen zeigt:



In seiner jetzigen Form kann Petja nur gehen, aber gleichzeitig kann er Hindernisse in der Nähe sehen (messen). Sein Gehirn ist jedoch produktiv genug, um Daten von vielen anderen Sensoren verarbeiten zu können. Senden Sie Ihre Vorschläge!


Wie man Petja klont


Einkaufsliste


3 , / . , :



, , . (, ), . . — . , ;)


NB: 9g , . . , , , SketchUp . , , , .




, 3 , hardware/body/. - ::



1, . - :



3 . , . :





. hardware/motherboard/. :



ATMega8 , . :



, , , . :



N.B. , ATMega8A 2.7-5.5, 6. — NiMH 1.2V . (6.4 ), , . , , !


( ):




, . ; . , , . , , , :



:



; , Q3 Q4 "" Vcc, , . :



, , , R6. 47 55 , ( ). , , (910 )!


( ). , CR2032, . ( , [] , , )
, , Q3 Q4 . , , , , , .


, . , . 2n3904, , , . , , .


, , , , :



.


, , :


  • isf471 2n3904.
  • Sharp GP2Y0A21YK0F:
  • LM393:


, , , ATMega8. :


  • -

-


50 ; 1 (0 ), 2 (90 ). , 16 (timer1), (timer2). , Servo.h , , fast PWM.


8 , timer1 1 ( 8).
ICR1 TOP (20000), , 20 , 50 . OCR1A OCR1B ( ) .


. timer2, , , ICR1, , . , 50 , , - :


  • timer2 128, , 4.096 ms = 256 * 128/(8 * 10^6).
  • timer2, , .
  • capture interrupt timer1 timer2 ( ).

4 2 , , 20 . , (1.5 ), :


OCR1A = 1500;    // left servo
OCR1B = 1500;    // right servo
OCR2  = 1500/16; // center servo


-, :


const uint8_t  zero[3] = {45, 50, 40};     // zero position of the servo (degrees)
const uint8_t range[3] = {25, 25, 20};     // the servos are allowed to move in the zero[i] +- range[i] interval

zero[3] , (. ). , 45° ( ), 45° , . , range[3] . , i zero[i]-range[i] zero[i]+range[i].



( , 0°-90°) uint8_t pos[3]. update_servo_timers() - . pos[i]=zero[i]+range[i] i=0,1,2.


. pos_beg[3], pos_end[3], time_start[3] duration[3]. , . :


  • pos[0] pos_beg[0], , ;
  • pos_end[0] (- );
  • time_start[0] (, );
  • , , duration[0] ( ). , (pos_end[0]-pos_beg[0])/duration[0] /.

movement_planner(), pos[] , update_servo_timers(), - pos[].



, , , ( ) . , . , . , :


  • 1: {zero[0]-range[0], zero[1]-range[1], zero[2]+range[2]}
  • 2: {zero[0]-range[0], zero[1]-range[1], zero[2]-range[2]}
  • 3: {zero[0]+range[0], zero[1]+range[1], zero[2]-range[2]}
  • 4: {zero[0]+range[0], zero[1]+range[1], zero[2]+range[2]}

2 ( ):


const int8_t advance_sequence[4][3] = {{-1, -1,  1}, {-1, -1, -1}, { 1,  1, -1}, { 1,  1,  1}};

, i step zero[i] + range[i]*advance_sequence[step][i].
:


    uint8_t step = steps_per_sequence-1; // at the initialization stage the (previous) movement is considered to be complete, thus the next movement will be planned starting from the step 0
    while (1) {
        if (is_movement_finished()) {
            step = (step + 1) % 4; // if previous movement is complete, then perform the next step; this variable loops as 0,1,2,3.
            plan_next_movement(step, advance_sequence); // execute next movement
        }
        movement_planner(); // update the servos position according to the planning
        _delay_ms(1);
    }


, , 4 5 . , ( , ), adc_left_eye adc_right_eye , :


        adc_left_eye  = adc_left_eye *.99 + adc_read(5)*.01; // low-pass filter on the ADC readings
        adc_right_eye = adc_right_eye*.99 + adc_read(4)*.01;

_delay_ms() , .99 1-.99 .


:


        uint8_t lobst = adc_left_eye  < distance_threshold; // obstacle on the left?
        uint8_t robst = adc_right_eye < distance_threshold; // obstacle on the right?

(, ) :


        if (is_movement_finished()) {
            if (!lobst && !robst) {
                sequence = advance_sequence; // no obstacles => go forward
            } else if (lobst && robst) {
                sequence = retreat_sequence; // obstacles left and right => go backwards
            } else if (lobst && !robst) {
                sequence = turn_right_sequence; // obstacle on the left => turn right
            } else if (!lobst && robst) {
                sequence = turn_left_sequence; // obstacle on the right => turn left
            }
            step = (step + 1) % steps_per_sequence; // if previous movement is complete, then perform the next step
            plan_next_movement(step, sequence); // execute next movement
        }

, !



! , , :


:


  • "", . , , . , ?
  • ( !) , , .
  • , , avr-gcc . , - .

:


, V2 , ! , // :


  • — , ;
  • , RC- ;
  • ;
  • R6 ;
  • ( ) ;
  • — . — , ;
  • Bewegen Sie den Elektrolyten leicht. Ich musste es kippen, weil ansonsten tut ihm das mittlere linke Bein weh;
  • Fügen Sie Teststellen hinzu, die mit einem Oszilloskop leicht zugänglich sind.
  • Fügen Sie ein Paar Debug-LEDs zum Debuggen ohne Oszilloskop hinzu.
  • Fügen Sie Lötpads für alle nicht verwendeten Mikroprozessorbeine zum Debuggen und weiteren Ausbau des Roboters hinzu.

Fazit


Petja macht schrecklichen Spaß!



All Articles