认识六腿三舵手Petya
我继续发表Arduino Brain系列文章。Petya是一种非常便宜(约合十美元)的六足动物。对于下雨天来说,这可能是一个不错的项目,它将使成年人和儿童都开心。既然我们在谈论娱乐,那么以下是佩蒂娅跳舞跳舞音乐的视频:
当然,我没有做任何声音分析,我只是给Petya编程以一定的节奏跳舞。这是另一个视频,其中Petya显示了他对玩杂耍球的蔑视:
以他目前的形式,佩蒂娅只能走路,但同时他也可以看到(测量到附近)障碍物的距离。但是,他的大脑足够有生产力,能够从许多其他传感器中提取数据,并发送您的建议!
如何克隆Petya
购物清单
3 , / . , :
- . , . - 10€ / 10 ( ), 2€ / 10 . , , . — , cheapduino - , .
- SG90 9G , 3 * 1.47€ /
- 4x AAA , 1.34€ /
- ATMega8A-AU (QFP-32), 1€ /
- IR LED + IR , 0.20€ /
- 1000uF 16V, 0.17€ /
- 2n3904 , 3 * 0.01€ /
- , , , 0805 . : hardware/motherboard/BOM.html.
, , . (, ), . . — . , ;)
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;
OCR1B = 1500;
OCR2 = 1500/16;
-, :
const uint8_t zero[3] = {45, 50, 40};
const uint8_t range[3] = {25, 25, 20};
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;
while (1) {
if (is_movement_finished()) {
step = (step + 1) % 4;
plan_next_movement(step, advance_sequence);
}
movement_planner();
_delay_ms(1);
}
, , 4 5 . , ( , ), adc_left_eye
adc_right_eye
, :
adc_left_eye = adc_left_eye *.99 + adc_read(5)*.01;
adc_right_eye = adc_right_eye*.99 + adc_read(4)*.01;
_delay_ms()
, .99
1-.99
.
:
uint8_t lobst = adc_left_eye < distance_threshold;
uint8_t robst = adc_right_eye < distance_threshold;
(, ) :
if (is_movement_finished()) {
if (!lobst && !robst) {
sequence = advance_sequence;
} else if (lobst && robst) {
sequence = retreat_sequence;
} else if (lobst && !robst) {
sequence = turn_right_sequence;
} else if (!lobst && robst) {
sequence = turn_left_sequence;
}
step = (step + 1) % steps_per_sequence;
plan_next_movement(step, sequence);
}
, !
! , , :
:
- "", . , , . , ?
- ( !) , , .
- , , avr-gcc . , - .
:
, V2 , ! , // :
- — , ;
- , RC- ;
- ;
- R6 ;
- ( ) ;
- — . — , ;
- 稍微移动电解液。我不得不倾斜它,因为 否则,左中腿会伤到他;
- 通过示波器轻松添加测试站点;
- 添加一对调试LED,无需示波器即可进行调试;
- 为所有未使用的微处理器支腿添加焊盘,以进行调试和进一步扩展机器人。
结论
佩蒂亚非常有趣!
