Robot walker.

Berätta om dina pågående projekt.
eAk
Inlägg: 74
Blev medlem: 10 september 2008, 22:50:23
Ort: Kungälv

Robot walker.

Inlägg av eAk »

Kan ju vara lite kul att dra igån en projekt tråd om mitt nystartade projekt.
Har inte kommit längre än att göra lite experiment kod och beställt delar som förhoppningsvis kommer på fredag så att man kan bygga i helgen.

En kort beskrivning.
MCU blir en Atmel atmega168 ser det ut som just nu.
kan hända att jag kör på pic18f2520 har både och hemma.

har beställt 18st micro servo för benen. Om jag kommer undan med det kör jag på 2st servo per ben. annars 3st så jag har beställt tillräckligt för 6st ben om det skulle vara så att jag kör på det istället för 4st ben.

Sensorer kommer att bli en i2c sonar modul som jag beställt från lawicel
och en sharp range finder som jag har liggandes sedan tidigare.

experiment koden jag har gjort änsålänge är bara att bevisa för mig att jag klarar av att styra servos och läsa av min range finder. Vilket var rätt simpelt.

Nästa prövning kommer när jag har satt ihop ett ben av servona och klura ut hur det ska styras på ett väl fungerande sätt. Bilder kommer när jag har kommit någon vart.

Kom gärna med förslag på hur jag ska bygga benen eller om ni kanske har skisser från liknande byggen ni själva gjort tidigare.

MVH Emil
Användarvisningsbild
kifkroker
Inlägg: 405
Blev medlem: 15 september 2006, 01:22:46
Ort: Oslo

Inlägg av kifkroker »

hexapoden som heter phoenix på lynxmotion forumet är tjusig, där har du även ganska bra mallar för ben-design

http://i214.photobucket.com/albums/cc6/ ... oenix3.jpg
eAk
Inlägg: 74
Blev medlem: 10 september 2008, 22:50:23
Ort: Kungälv

Inlägg av eAk »

Nu har jag kommit såpas långt att det finns lite kod iallafall.
fullständigt otestad. Men det blir väl att koppla in någon av mina 2 servon jag har hemma om inte servona jag beställt kommer imorgon och testa iallafall.
Har försökt konvertera kod från min pic18 som jag skrev innan jag börja beställa delar. Kör med atmega168 robot controllern jag beställde.
Hbryggan tar ju dock upp ett par io som jag gärna hadde haft till servon.
men det räcker till att köra 9servo så jag kan koppla sharp avstånds mätare och sonar en på servo 9 och svepa med.

Funkar den okej så blir det väl att man uppgraderar till någon 40+ pinnars MCU. så man kan få dit sensorer för om benen gå emot något. kompass, lite ir reflex sensorer om man ska göra någon linje följning eller liknande.

Någon som är hajj på atmel som är sugen på attk olla vad jag åstakommit änsålänge. jag är total noob på atmel.
dinmin
Inlägg: 2
Blev medlem: 22 februari 2008, 02:05:01
Skype: d1nm1n
Ort: Finspång
Kontakt:

Inlägg av dinmin »

Vi håller på och labbar med atmel i skolan, en atmega644 processor för att vara specifik. Vill inte säga att jag kan mycket än men inte helt grön heller :P Skulle vara intressant att se koden ändå, se lite hur du byggt upp det osv :)
Användarvisningsbild
$tiff
Inlägg: 4941
Blev medlem: 31 maj 2003, 19:47:52
Ort: Göteborg
Kontakt:

Inlägg av $tiff »

@ eAk

Har du dedicerad hårdvara för att generera servopulserna, eller tänker du försöka skriva den biten själv? En 10-12 servon går att trycka in på en timer innan det blir fullt på en period. Med 18 servon måste man verkligen hålla tungan rätt i mun om man ska styra dem m.h.a timer-avbrott från huvudkontrollern (ej dedicerad kontroller).
eAk
Inlägg: 74
Blev medlem: 10 september 2008, 22:50:23
Ort: Kungälv

Inlägg av eAk »

Stiff på en timer 10-12 servon? vaddå menar du att dom ska pulsas en efter en luggandes efter timern från 0-20ms ? jag har löst det så att var 20ms så startar en ny timer som räknar till 2ms och slår på/av alla pinnar utt för att skapa de pulser som varje servo vill ha. det innebär att jag kan styra så många servo som jag har io och processorn är tillräckligt snabb att hantera att kolla av utan att förlora precision men i 20mhz så är det ju hur många servon som hellst typ.

jag satt och labbade inatt och har kommit såpas långt att det finns rörelse rutin för att vandra framåt. dock ej testat för jag har bara satt ihop 2 av benen än, då servona jag beställt kom igår.
dinmin
jo du kan få se koden om det går att ladda upp den här för den är för lång att läggas i ett inlägg. men kan ju ta ut något exempel ur koden och klistra in här. Men där kan du se mitt sätt att styra massor av servon.
jag har funderat att byta till 644 processor också den har väl 100io?

Jag får väl ta någon bild när det börjar likna något.
Senast redigerad av eAk 17 september 2008, 18:18:03, redigerad totalt 2 gånger.
eAk
Inlägg: 74
Blev medlem: 10 september 2008, 22:50:23
Ort: Kungälv

Inlägg av eAk »

walker.c

Kod: Markera allt

#define F_CPU 20000000UL  // 20 MHz


#include <avr/io.h>
#include <avr/interrupt.h>
#include <util/delay.h>

#include "walker.h"

volatile uint8_t timer_extend = 0; //för att räkna till 20ms istället för bara 10
volatile uint8_t klocka_10ms_tic = 0; //Lär ju behöva hålla koll på tiden som löper för servo styrningen.
volatile uint8_t klocka_1sek_tic = 0; //behövs säkert hålla reda på sekunder
volatile uint8_t klart = 0;
/*
Här har vi flera servon som ska ha värdet mellan 60 och 160
+60grader=(160=2ms), 0grader=(100=1.5ms), -60grader=(60)
*/
volatile uint8_t servo1 = 100;
volatile uint8_t servo2 = 100;
volatile uint8_t servo3 = 100;
volatile uint8_t servo4 = 100;
volatile uint8_t servo5 = 100;
volatile uint8_t servo6 = 100;
volatile uint8_t servo7 = 100;
volatile uint8_t servo8 = 100;
volatile uint8_t servo9 = 100;
volatile uint8_t servo10 = 100;
volatile uint8_t servo11 = 100;

/*Dessa stora vektorer bör plockas bort och bara ha 1 vektor och spara
 servo värdena i eprom och läsa ur den rörelse som ska köras till den 
vektorn som finns i ram och därmed spara ram och kod igenom att bara 
behöva 1 rörelse funktion som kan köra alla rörelser.*/

						//		1,	2,	3,	4,	5,	6,	7,	8
uint8_t walk_fram_vect[] = {	150,100,150,100,150,100,150,100, //1
								150,62 ,150,100,150,80 ,150,80 , //2
								62 ,62 ,150,100,150,80 ,150,80 , //3
								62 ,100,150,100,150,80 ,150,80 , //4
								62 ,100,150,62 ,150,80 ,150,80 , //5
								62 ,100,62 ,62 ,150,80 ,150,80 , //6
								62 ,100,62 ,100,150,100,150,100, //7
								62 ,80 ,62 ,80 ,150,62 ,150,100, //8
								62 ,80 ,62 ,80 ,62 ,62 ,150,100, //9
								62 ,80 ,62 ,80 ,62 ,100,150,100, //10
								62 ,80 ,62 ,80 ,62 ,100,150,62 , //11
								62 ,80 ,62 ,80 ,62 ,100,62 ,62 , //12
								62 ,100,62 ,100,62 ,100,62 ,100};//13
uint8_t walk_bak_vect[104];
uint8_t walk_vanster_vect[104];
uint8_t walk_hoger_vect[104];

/*interrupt hanterare för timer 0*/
ISR(TIMER0_OVF_vect)
{
	TCNT0 = 61;
	servo_update();
	TIFR0 |=(1<<0);
}

int main(void)
{
	//timer0
	TCCR0A=0b00000000;
	TCCR0B=0b00000101; //1024 prescaler
	TIMSK0=0b00000001;
	//timer2
	TCCR2A=0b00000000;
	TCCR2B=0b00000110; //256prescaler (195=2.5ms, 156=2ms, 78=1ms)
	TIMSK2=0b00000000;
	
	klocka_10ms_tic = 0;
	klocka_1sek_tic = 0;
	
	DDRD = 0b10011100;
	DDRC = 0b00000111;
	DDRB = 0b00011001;

	sei();

	while(1)
	{
		//gör något som prata med sonar på I2C och läs av sharp range på ADC
		//få roboten att röra på sig. igenom att hantera servoX variablerna
		//komunicera med omvärlden igenom seriell porten.

		walk_fram();/*dena funktionen utelämnade jag efter som den 
enbart läser av vectorn som finns definierad som global och inehåller de 
värden servon ska ha varje sekund för att röra sig framåt.*/

		
	}

}
/*
denna funktionen kallas av interrupt
ställer alla servo till 1 var 20ms sedan dem till 0 beroende på vilken riktning dom ska ha
Varje steg på servo är ungefär 1grad ((-60grader = 60) (0grader = 100) (+60grader = 160))
jag antar det kommer behövas någon form av lista där olika rörelser för ett ben finns representerade.
med servo position någon form av delay innan nästa rörelse får ske ocksåvidare.
*/
void servo_update(void)
{
	if (timer_extend == 0)
	{
		timer_extend++;
	}
	if (timer_extend == 1) //det har gått 20ms så ge alla servon sin puls.
	{
		timer_extend = 0;
		TCNT2 =0;
		s1_1
		s2_1
		s3_1
		s4_1
		s5_1
		s6_1
		s7_1
		s8_1
		s9_1
		s10_1
		s11_1
		while(TCNT2 <= 161)
/*tyvärr är upplösningen på 8bitars timern rätt dålig i 20mhz men det 
verkar som att inköpta servon
 bara klarar röra sig 60grader från 0 i vardera riktning.*/
		{
			if(TCNT2 >= servo1) //(Här testar vi ifall det är dags att avsluta pulslängden till varje servo.)
			{
				s1_0
			}
			if(TCNT2 >= servo2)
			{
				s2_0
			}
			if(TCNT2 >= servo3)
			{
				s3_0
			}
			if(TCNT2 >= servo4)
			{
				s4_0
			}
			if(TCNT2 >= servo5)
			{
				s5_0
			}
			if(TCNT2 >= servo6)
			{
				s6_0
			}
			if(TCNT2 >= servo7)
			{
				s7_0
			}
			if(TCNT2 >= servo8)
			{
				s8_0
			}
			if(TCNT2 >= servo9)
			{
				s9_0
			}
			if(TCNT2 >= servo10)
			{
				s10_0
			}
			if(TCNT2 >= servo11)
			{
				s11_0
			}
		}
	}
	if(klocka_10ms_tic == 100)
	{
		klocka_1sek_tic++;
		klocka_10ms_tic = 0;
	}
	klocka_10ms_tic++;
}

walker.h

Kod: Markera allt

/*
	I2C
	pc5 = SCL
	pc4 = SDA

	Serial
	pd1 = TX
	pd0 = RX

	Servon
	pb0 = s1
	pb3 = s2
	pb4 = s3
	pb5 = s4
	pd2 = s5
	pd3 = s6
	pd4 = s7
	pd7 = s8
	pc0 = s9
	pc1 = s10
	pc2 = s11

	Sensor
	ADC6 = sharp

	Knapp
	pc3 = knapp1
*/

#define s1_1 PORTB |=(1<<0);
#define s1_0 PORTB &=~((1<<0));

#define s2_1 PORTB |=(1<<3);
#define s2_0 PORTB &=~((1<<3));

#define s3_1 PORTB |=(1<<4);
#define s3_0 PORTB &=~((1<<4));

#define s4_1 PORTB |=(1<<5);
#define s4_0 PORTB &=~((1<<5));

#define s5_1 PORTD |=(1<<2);
#define s5_0 PORTD &=~((1<<2));

#define s6_1 PORTD |=(1<<3);
#define s6_0 PORTD &=~((1<<3));

#define s7_1 PORTD |=(1<<4);
#define s7_0 PORTD &=~((1<<4));

#define s8_1 PORTD |=(1<<7);
#define s8_0 PORTD &=~((1<<7));

#define s9_1 PORTC |=(1<<0);
#define s9_0 PORTC &=~((1<<0));

#define s10_1 PORTC |=(1<<1);
#define s10_0 PORTC &=~((1<<1));

#define s11_1 PORTC |=(1<<2);
#define s11_0 PORTC &=~((1<<2));

extern int main(void);
extern void servo_update(void);
extern void walk_fram(void);
Senast redigerad av eAk 18 september 2008, 01:04:35, redigerad totalt 3 gånger.
Gimbal
Inlägg: 8649
Blev medlem: 20 april 2005, 15:43:53

Inlägg av Gimbal »

Jag skulle nog kört en annan variant.

En 16 bitars timer som snurrar runt med lagom takt, vid noll får du ett interrupt där du sätter alla servo utgångar till 1, samt du passar på att sortera alla servon i en lista efter i vilken ordning deras pulser ska nollställas.
tex servo 7 har kortast puls och ska falla när räknaren når 512, servo 3 vid 820 osv osv.

Sedan sätter du upp att du vill ha interrupt när räknaren når första värdet i listan.

När det interrupptet kommer nollställer du det servots utgång samt sätter upp att du vill ha nästa interrupt vid nästa värde i listan osv osv.

På så vis kan du ha jämrans många servon (bara du har pinnar ut så det räcker) med väldigt liten belastning på processorn.
Användarvisningsbild
maha
EF Sponsor
Inlägg: 1685
Blev medlem: 22 november 2005, 09:47:02
Ort: Jakobstad, Finland

Inlägg av maha »

Jepp, så skulle jag också ha gjort. Tror absolut det är en av de bästa lösningarna. Ganska mycket svengelska i koden också men den fungerar ju iofs lika bra för det. :wink:
eAk
Inlägg: 74
Blev medlem: 10 september 2008, 22:50:23
Ort: Kungälv

Inlägg av eAk »

det låter rätt vettigt faktiskt.
får fundera ut något bra sett att implimentera det.
men det får bli vid ett senare skede just nu funkar det utmärkt.
så det är att bygga ihop alla benen montera dom testa lite med hur man ska få den att gå på bästa sätt och få igång min sonar och adc avläsning på min sharp avstånds sensor.
Användarvisningsbild
korp
Inlägg: 1216
Blev medlem: 30 maj 2006, 02:21:18
Ort: Strömstad

Inlägg av korp »

eAk, kan du radbryta den där mastodontkommentaren "/*Dessa stora vektorer..." i din kod så tråden blir läsbar utan allt för mycket horisontell scrollning?
eAk
Inlägg: 74
Blev medlem: 10 september 2008, 22:50:23
Ort: Kungälv

Inlägg av eAk »

korp fixat in lite radbrytning.

Alla ben är ihopsatta nu satte dom på ett cd fodral som chassie.
men dock var 2liter glass kartong i plast för klen så jag håller på att super attaka på lite extra plastbitar så att dom ska bli tillräckligt stabila.
SvenW
Inlägg: 1156
Blev medlem: 24 april 2007, 16:23:10
Ort: Göteborg

Inlägg av SvenW »

Bara en detalj om konvention i C-programmering:
Jag skulle skriva macron så här:

#define S1_1(void) PORTB |= (1<<0)
#define S1_0(void) PORTB &=~ ((1<<0))

och anropa dem så här:

S1_1();
S1_0();
eAk
Inlägg: 74
Blev medlem: 10 september 2008, 22:50:23
Ort: Kungälv

Inlägg av eAk »

Jag har inte gjort något på roboten på gör länge.
Men nu när alla skolarbeten är klara har jag suttit och pillat med den lite i natt.
Tog mig en liten bild också.

Bild

Bild

Klickbara bilder
Skriv svar