You are on page 1of 10

Zdalne sterowanie w 5 minut

Gamepad + WiFi + Adam Sodowy style

Konrad Gawda PyWaw 13.02.2012 (Warszawska grupa uytkownikw Pythona)

Plan dziaa
Rozpoznanie walk Hardware Software PC Software device Software in C Poczy i gotowe

Projekt

Zaoenie - majc dostpny minikomputerek x86 z WiFi, bateri i dwa silniczki zrobi minimalnym wysikiem zdalnie sterowany "pojazd". Kamerka na zdjciu - w tym projekcie nie uyta... moe obudzi ambicje ktrego ze suchaczy...

"Architektura" :)
MSG = LRLRL...
- na przemian: literka kontrolna, warto binarna

(Python code)

(Python code)

(C code)

Hardware
Gamepad PC x86 box MAX232 ATmega8 L293D "Robot"

Gamepad (pygame) + UDP


import socket, pygame def get_input (j): pygame .event.pump() if j.get_button( 8): #STOP button return (C_STOP, 0, 0) return (c, -j.get_axis( 1), -j.get_axis( 4)) def send_command (sock, action, Lspeed, Rspeed): data = SIGNATURE + chr(action) data += 'J' if Lspeed < 0 else 'L' data += chr(abs(Lspeed) ) data += 'P' if Rspeed < 0 else 'R' data += chr(abs(Rspeed) ) sock .sendall(data)

Tu pokazuj okrojony kod, eby objani sposb dziaania (nie odpali si w tej postaci), obok kluczowe linijki.

j = pygame.joystick.Joystick(0) j.init() pygame.event.pump() j.get_axis(1)

def main(argv): pygame .init() j = pygame.joystick .Joystick( 0) j.init() s = socket.socket(socket .AF_INET, socket .SOCK_DGRAM) s.connect((argv[ 0], UDP_PORT)) while True: cmd,L,R = get_input(j) #if cmd==C_STOP: # break send_command(s, cmd, int(L*SPEED_MAX), int(R*SPEED_MAX)) time .sleep(0.1) send_command(s, C_STOP, int(L*SPEED_MAX), int(R*SPEED_MAX)) s.close() j.quit()

Odbir UDP + wysyanie seial


import serial, socket def recv_UDP (soc): s = soc.recv(8) #except socket.timeout... cmd = ord(s[3]) chars = s[4:8] return (cmd, chars) def main(argv): s = socket.socket(socket .AF_INET, socket .SOCK_DGRAM) s.bind(('',UDP_PORT)) s.settimeout( None) ser = serial.Serial(COM_PORT, timeout =1) ser.write('\0\0Sync') ser.write(ZERO_CHARS)

while True: cmd,chars = recv_UDP(s) #if cmd==C_STOP: # s.settimeout(None) # chars = ZERO_CHARS #else: # if s.gettimeout()==None: # s.settimeout(ACTIVE_TIMEOUT) ser .write(chars) s.close() ser.write(ZERO_CHARS) ser.close()

ser = serial.Serial(COM_PORT, timeout=1) chars = soc.recv(8)[4:8] ser.write(chars)

Kod na mikrokontroler (jzyk C :)


#include "avr/io.h" #include <avr/interrupt.h> #include <avr/sleep.h> inline static void desynchroznize ( void ) { OCR1AL = 0; OCR1BL = 0xFF; state_sync = S_syncS; } //... int main (void) { IOinit1(); TimerInit(); USART_Init(); sei(); while(1) {} return(0); }

Kod na mikrokontroler c.d.


ISR(USART_RXC_vect) { uint8_t odebrane = UDR; switch(state_sync) { //... case S_recvL: if (odebrane == 'L') { state_sync = S_recvLv; PORTC = PORTC & ~mask_L_dir | bits_L_forw; } else if (odebrane == 'J') { PORTC = PORTC & ~mask_L_dir | bits_L_reve; state_sync = S_recvLv; } else desynchroznize(); break; case S_recvLv: OCR1AL = odebrane; state_sync = S_recvR; break; //... to samo dla R default: desynchroznize(); } }

odebrane = UDR; PORTC &= ~mask_L_dir | bits_L_forw; OCR1AL = odebrane;

Dzikuj za uwag

You might also like