IRobot Roomba рдХреЗ рд▓рд┐рдП рдШрд░ рдХрд╛ рдмрдирд╛ рдЖрдИрдЖрд░ рд░рд┐рдореЛрдЯ

рдореЗрд░реЗ рдкрд┐рдЫрд▓реЗ рдкреЛрд╕реНрдЯ рдореЗрдВ рдПрдХ рд╕рд░реНрд╡реЗрдХреНрд╖рдг, "рдЖрдИрдЖрд░ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ iRobot Roomba рд░реЛрдмреЛрдЯ рд╡реИрдХреНрдпреВрдо рдХреНрд▓реАрдирд░ рдХрд╛ рдкреНрд░рдмрдВрдзрди", рдиреЗ рджрд┐рдЦрд╛рдпрд╛ рдХрд┐ рд╕рдореБрджрд╛рдп рдХреЛ рд░реВрдм рдХреЗ рд▓рд┐рдП IR рд░рд┐рдореЛрдЯ рдХрдВрдЯреНрд░реЛрд▓ рдмрдирд╛рдиреЗ рдХрд╛ рддрд░реАрдХрд╛ рд╕реАрдЦрдиреЗ рдореЗрдВ рд░реБрдЪрд┐ рд╣реИред рдЗрд╕рд▓рд┐рдП рдорд┐рд▓рддреЗ рд╣реИрдВ! =)



рд░рд┐рдореЛрдЯ рдХрдВрдЯреНрд░реЛрд▓ рдпреЛрдЬрдирд╛:



рдореИрдВрдиреЗ рдЗрд╕реНрддреЗрдорд╛рд▓ рдХрд┐рдпрд╛:


рдкреНрд░рд╛рд░рдВрдн рдореЗрдВ, рдореИрдВрдиреЗ рдПрдХ "рд╕реНрдкрд╛рд░реНрдЯрди" рд╡рд┐рдХрд▓реНрдк рдмрдирд╛рдиреЗ рдХреА рдпреЛрдЬрдирд╛ рдмрдирд╛рдИ - рдЧрд░реНрдореА рд╣рдЯрдиреЗ рдореЗрдВ рдмрдЯрди рдХреЗ рд╕рд╛рде рдПрдХ рдмреЛрд░реНрдб, рд▓реЗрдХрд┐рди рдлрд┐рд░ рдореИрдВрдиреЗ рдорд╛рдорд▓реЗ рдореЗрдВ рд╕рдм рдХреБрдЫ рдЗрдХрдЯреНрдард╛ рдХрд░рдиреЗ рдХрд╛ рдлреИрд╕рд▓рд╛ рдХрд┐рдпрд╛ред рдореИрдВрдиреЗ рдЙрд╕ рдорд╛рдорд▓реЗ рдХреЛ рдЪреБрдирд╛ рдЬреЛ рдмрд┐рдХреНрд░реА рдкрд░ рд╣реИ, рдореБрдЭреЗ GAINTA G401 рдкрд╕рдВрдж рд╣реИред рдЗрд╕рдХреЗ рддрд╣рдд рдореИрдВрдиреЗ рднреБрдЧрддрд╛рди рдХрд┐рдпрд╛:



рдмрдЯрди рдХрд╛рд░реНрдп:
рдПрд╕рдбрдмреНрд▓реНрдпреВ 1 - рдбреЙрдХ
SW2 - рд╡рд┐рд░рд╛рдо / рд╢рдХреНрддрд┐
SW3 - рдлреЙрд░рд╡рд░реНрдб рд▓реЗрдлреНрдЯ
SW4 - рд╕рд╛рдл
SW5 - рд╡рд╛рдо
рдПрд╕рдбрдмреНрд▓реНрдпреВ 6 - рдлреЙрд░рд╡рд░реНрдб
рдПрд╕рдбрдмреНрд▓реНрдпреВ 7 - рд╕реНрдкреЙрдЯ
SW8 - рд╕рд╣реА рд╣реИ
SW9 - рдлреЙрд░рд╡рд░реНрдб рд░рд╛рдЗрдЯ

рдЬреИрд╕рд╛ рдХрд┐ рдмрд╛рдж рдореЗрдВ рдкрддрд╛ рдЪрд▓рд╛, SW2 рдмрдЯрди, рдЬреЛ рд╡рд┐рдЪрд╛рд░ рдХреЗ рдЕрдиреБрд╕рд╛рд░, рджрдмрд╛рдП рдЬрд╛рдиреЗ рдкрд░ "рд░реЛрдХреЗрдВ" рдЖрджреЗрд╢ рднреЗрдЬрддрд╛ рд╣реИ, рдФрд░ рдЬрдм "рдкрд╛рд╡рд░" рдмрдЯрди рдХреЛ рд▓рдВрдмреЗ рд╕рдордп рддрдХ рджрдмрд╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рдЗрд╕рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдпреЗ рдХрд╛рд░реНрдп "рдХреНрд▓реАрди" рдмрдЯрди рджреНрд╡рд╛рд░рд╛ рдХрд┐рдП рдЬрд╛рддреЗ рд╣реИрдВред рдпрд╣ рд░реЛрдмреЛрдЯ рдХреНрд▓реАрдирд░ рдкрд░ рдмрдЯрди рдХреЗ рд░реВрдк рдореЗрдВ рд╣реА рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ: рдПрдХ рдЫреЛрдЯрд╛ рдкреНрд░реЗрд╕ - рд╕рдлрд╛рдИ рдХреЗ рд▓рд┐рдП, рдСрдкрд░реЗрд╢рди рдХреЗ рджреМрд░рд╛рди - рдПрдХ рд╕реНрдЯреЙрдк, рдФрд░ рдПрдХ рд▓рдВрдмрд╛ рдкреНрд░реЗрд╕ - рдмрдВрджред рд╕рд╣рд┐рдд рдЕрдЧрд░ рдХреЛрдИ рд░рд┐рдореЛрдЯ рдХрдВрдЯреНрд░реЛрд▓ рджреЛрд╣рд░рд╛рдПрдЧрд╛ - рддреЛ SW2 рд╕реНрдерд╛рдкрд┐рдд рди рдХрд░реЗрдВред

рдХрд╛рд░реНрдпрдХреНрд░рдо рд╕реВрдЪреАрдХрд░рдг
/*   - Irobot Roomba.    Atmel ATTINY2313A. FUSE-: Fuse Low Byte: CKDIV|CKOUT|SUT|SKSEL| 0 | 1 |10 |0100 | 0x64 Default 1 | 1 |10 |1100 | 0b11101100=0xEC   3-8  */ //#define F_CPU 7.3728E6 //#define __AVR_ATtiny2313A__ #include <avr/io.h> #include <avr/interrupt.h> #include <avr/sleep.h> /*------<>-----*/ // 39477  // 25,3 : #define P_GEN {TCNT0=0; PORTB |= 0x8; while (TCNT0 < 93); PORTB &= ~0x8; while (TCNT0 < 186);} //Roomba : #define LEFT 129 #define FORWARD 130 #define RIGHT 131 #define SPOT 132 #define DOCK 133 #define CLEAN 136 #define PAUSE 137 #define POWER 138 #define FORWARD_LEFT 139 #define FORWARD_RIGHT 140 #define TEST 170 /*----------------<:>----------------*/ void init(void) { //    /1: CLKPR = (1<<CLKPCE); CLKPR = (0<<CLKPS0)|(0<<CLKPS1)|(0<<CLKPS2)|(0<<CLKPS3); // : PORTD = 0xFF; DDRD = 0x0; PORTB = (1<<PORTB0)|(1<<PORTB1)|(1<<PORTB2); DDRB = (1<<DDB3)|(1<<DDB4); // : GIMSK = 0x30; //(1<<PCIE)|(1<<4); PCMSK = 0x3; //(1<<PCINT0)|(1<<PCINT1); PCMSK2 = 0x7F; } void ir_tx(unsigned char data_ir) { PORTB |= (1<<PB4); //  /*  : 1: __________ 2862uS |988uS |_____ 0: _____ 887uS| 2862uS |__________    ~16870 uS */ unsigned char cnt; // : TCCR0B = (0<<CS12)|(0<<CS11)|(1<<CS10); //   f/1 TCCR1B = (0<<CS12)|(1<<CS11)|(1<<CS10); //   f/64 for (cnt=0; cnt<8; cnt++) { TCNT1=0; if (data_ir & (0x80 >> cnt)) { // 1 while (TCNT1 < 330) P_GEN; while (TCNT1 < (330+114)) ; } else { // 0 while (TCNT1 < 113) P_GEN; while (TCNT1 < (330+114)) ; } } TCNT1=0; while (TCNT1 < 1950) ; PORTB &= ~(1<<PB4); //  } void send_command(void) { volatile unsigned char button_b; volatile unsigned char button_d; volatile unsigned char button_b_new; volatile unsigned char button_d_new; unsigned char pause_cnt = 0; TCCR1B = (0<<CS12)|(1<<CS11)|(1<<CS10); // f/64 TCNT1=0; while (TCNT1 < 346); //346 -  3 ms button_b = ~PINB & ((1<<PINB0)|(1<<PINB1)); button_d = ~PIND & 0x7F; button_b_new = button_b; button_d_new = button_d; while ((button_b == button_b_new)&&(button_d == button_d_new)) { if ((button_b_new == 0) && (button_d_new == 0)) break; if (button_b == (1<<PINB0)) {ir_tx(DOCK);} if ((pause_cnt < 20) && (button_b == (1<<PINB1))) {ir_tx(PAUSE); pause_cnt++;} if (pause_cnt >= 20) {ir_tx(POWER);} if (button_d == (1<<PIND0)) {ir_tx(FORWARD_LEFT);} if (button_d == (1<<PIND1)) {ir_tx(CLEAN);} if (button_d == (1<<PIND2)) {ir_tx(LEFT);} if (button_d == (1<<PIND3)) {ir_tx(FORWARD);} if (button_d == (1<<PIND4)) {ir_tx(SPOT);} if (button_d == (1<<PIND5)) {ir_tx(RIGHT);} if (button_d == (1<<PIND6)) {ir_tx(FORWARD_RIGHT);} button_b_new = ~PINB & ((1<<PINB0)|(1<<PINB1)); button_d_new = ~PIND & 0x7F; } } /*----------------------< :>------------------------*/ ISR(PCINT_B_vect) { cli(); send_command(); sei(); } ISR(PCINT_D_vect) { cli(); send_command(); sei(); } /*-----------------<  >-----------------------*/ int main(void) { init(); sei(); for(;;) { set_sleep_mode(SLEEP_MODE_PWR_DOWN); sleep_mode(); } } 



рдлреЛрдЯреЛ рдкреВрд░рд╛:



рдмрдЯрди рдХреЗ рд╣рд╕реНрддрд╛рдХреНрд╖рд░, рдЬрд╝рд╛рд╣рд┐рд░ рд╣реИ, рдЕрдирд╛рдбрд╝реА рджрд┐рдЦрддреЗ рд╣реИрдВ - рдЕрдм рдореИрдВ рд╕рдордЭрддрд╛ рд╣реВрдВ рдХрд┐ рдЙрддреНрдХреАрд░реНрдгрди рдПрдХ рд╕рд╛рдзрд╛рд░рдг рдорд╛рдорд▓рд╛ рдирд╣реАрдВ рд╣реИ! :)

рдмреЛрд░реНрдб рдЦреБрдж:





рдХрдВрдбрдХреНрдЯрд░ рдЬреЛ рдкреАрдЫреЗ рдХреА рддрд░рдл рдХрд┐рдП рдЧрдП рддрд╛рд░реЛрдВ рд╕реЗ рдХрд┐рдП рдЬрд╛рдиреЗ рд╡рд╛рд▓реЗ рдереЗред

рдкреНрд░рджрд░реНрд╢рди рд╡реАрдбрд┐рдпреЛ:




KiCAD рдкрд░рд┐рдпреЛрдЬрдирд╛ рдлрд╛рдЗрд▓реЗрдВ: RemoteControlPCB.zip ред
рдлрд░реНрдорд╡реЗрдпрд░: RoombaRemoteControl.elf.hex

USBasp рдкреНрд░реЛрдЧреНрд░рд╛рдорд░ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдлрд░реНрдорд╡реЗрдпрд░ рдХреЗ рд▓рд┐рдП, avrdude рдкреНрд░реЛрдЧреНрд░рд╛рдо:
 avrdude -p t2313 -c usbasp -U flash:w:./RoombaRemoteControl.elf.hex 

рдХреНрд╡рд╛рд░реНрдЯреНрдЬ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдлрд╝рд░реНрдорд╡реЗрдпрд░ рдлреНрдпреВрдЬрд╝-рдмрд┐рдЯреНрд╕:
 avrdude -p t2313 -c usbasp -U lfuse:w:0xEC:m 

Source: https://habr.com/ru/post/In169967/


All Articles