Robot walker.
Robot walker.
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
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
- MicaelKarlsson
- Inlägg: 4669
- Blev medlem: 18 juni 2004, 09:16:07
- Ort: Aneby
- Kontakt:
Låter ju spännande det här så lycka till!!
Lite tips:
http://www.lynxmotion.com/Category.aspx?CategoryID=3
http://www.lynxmotion.net/viewforum.php ... f6303a18ba
http://en.wikipedia.org/wiki/Hexapod_(robotics) <--- Hela skall vara med!!
http://www.ocf.berkeley.edu/~vincebot/r ... _robot.htm
http://hackedgadgets.com/2008/06/06/hex ... nc-router/
Lite tips:
http://www.lynxmotion.com/Category.aspx?CategoryID=3
http://www.lynxmotion.net/viewforum.php ... f6303a18ba
http://en.wikipedia.org/wiki/Hexapod_(robotics) <--- Hela skall vara med!!
http://www.ocf.berkeley.edu/~vincebot/r ... _robot.htm
http://hackedgadgets.com/2008/06/06/hex ... nc-router/
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
http://i214.photobucket.com/albums/cc6/ ... oenix3.jpg
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.
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.
@ 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).
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).
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.
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.
walker.c
walker.h
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.
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.
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.
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.
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.