Tasapainoilurobottia tekemässä

Hienoa kuulla, että projekti etenee! Toivottavasti tästä nähdään jossain vaiheessa vielä artikkeliakin :sunglasses:

Olen pari päivää paininut Wiin MotionPlus palikan lukemisen kanssa. MotionPlus palikan toimivuuden olen testannut Arduinolla. Tietoa MotionPlussan käyttämästä protokollasta: http://jjshortcut.wordpress.com/2010/10/12/bus-pirate-i2c-wiimotion-plus/. Käytän Peter Fleuryn i2c kirjastoa ja olen säätänyt i2c:n kellotaajuden oikeaksi.

Tässä tämänhetkinen koodi:

[code]#include <avr/io.h>
#include <stdlib.h>
#include <twimaster.c>
#include <util/delay.h>
#define USART_BAUDRATE 9600
#define UBRR_VALUE (((F_CPU / (USART_BAUDRATE * 16UL))) - 1)

static void avr_init(void);
void SendString(const char *s);
void SendChar(char CharData);
void SendInt(int intvalue);
int ReadADC(uint8_t adctouse);
char ReceiveChar(void);
void wmp_Init(void);
void wmp_Calibrate(void);
void wmp_SendZero(void);
int yaw, pitch, roll, yaw0=0, pitch0=0, roll0=0;
unsigned char data[6];

int main(void)
{
avr_init();
i2c_init();
wmp_Init();
wmp_Calibrate();
SendString("\r\n");
SendInt(yaw0);
SendChar(’ ‘);
SendInt(pitch0);
SendChar(’ ');
SendInt(roll0);
for(;;);
}

static void avr_init(void)
{
//UART
UBRR0H = (UBRR_VALUE >> 8);
UBRR0L = UBRR_VALUE;
UCSR0C = (1 << UCSZ01)|(1 << UCSZ00);
UCSR0B = (1 << RXEN0) | (1 << TXEN0);

//ADC
ADCSRA |= (1 << ADPS2)|(1 << ADPS1)|(1 << ADPS0);
ADMUX |= (1 << REFS0);
ADCSRA |= (1 << ADEN);
ADMUX &= ~(1 << ADLAR);

return;

}

void SendChar(char CharData)
{
while(!(UCSR0A&(1<<UDRE0)));
UDR0 = CharData;
}

char ReceiveChar(void)
{
while(!(UCSR0A&(1<<RXC0)));
return UDR0;
}

void SendString(const char *s)
{
while (*s)
SendChar(*s++);
}

void SendInt(int intvalue)
{
char buffer[5];
itoa(intvalue, buffer, 10);
SendString(buffer);
}

int ReadADC(uint8_t adctoread)
{
int ADCvalue;
ADMUX |= adctoread;
ADCSRA |= (1 << ADSC);
ADCvalue = ADCL;
ADCvalue = (ADCH << 8) + ADCvalue;
return ADCvalue;
}

void wmp_Init(void)
{
i2c_start_wait(0xA6); // 0xA6 = ((0x53<<1) + I2C_WRITE)
i2c_write(0xFE);
i2c_write(0x04);
i2c_stop();

}

void wmp_SendZero(void)
{
i2c_start_wait(0xA4); // 0xA4 = ((0x52<<1) + I2C_WRITE)
i2c_write(0x00);
}

void wmp_Calibrate(void)
{
for(uint8_t i=0; i<10; i++)
{
wmp_SendZero();
i2c_rep_start(0xA5); // 0xA5 = ((0x52<<1) + I2C_READ)
for(uint8_t i=0; i<5; i++)
data[i] = i2c_readAck();
data[5] = i2c_readNak();
i2c_stop();
_delay_ms(1);

	yaw0 += (((data[3]>>2)<<8)+data[0])/10;
	pitch0 += (((data[4]>>2)<<8)+data[1])/10;
	roll0 += (((data[5]>>2)<<8)+data[2])/10;
}

}[/code]
Ohjelma keskeytyy wmp_Init funktiossa i2c_stop(); kohtaan. I2c_stop jumittaa while-looppiin:

/*************************************************************************
 Terminates the data transfer and releases the I2C bus
*************************************************************************/
void i2c_stop(void)
{
    /* send stop condition */
	TWCR = (1<<TWINT) | (1<<TWEN) | (1<<TWSTO);
	
	// wait until stop condition is executed and bus released
	while(TWCR & (1<<TWSTO));

}/* i2c_stop */

Olen kokeillut kommentoida while-loopin pois, mutta sitten ohjelma jumittuu seuraavaan i2c-käskyyn.

hei,aloittelen myös arduinon käyttöä,ajattelin vaihtaa picaxe:n arduinoon kun enemmän toimintoja ei niin alkukantainen ohjelmointi,mahdollisuuksia enemmän,lähinnä tuo sama itse seisova robo nyt ekaksi projektiksi josta myöhemmin sitten täysikokoinen segway tarkoitus tehdä huviksi ja hyödyksi.
aluksi vähän kyselen.
riittääkö arduino uno r3 tuohon projektiin hyvin(yms,vastaaviin myöhemmin)
mistä edullisin tilata suomesta(ei visakorttia)
apuja,neuvoja ohjelmien ongelmissa?
askarruttaa myös,mistä moottority,täys kokoiseen segway:hin ?
minkälaiset moottorinohjaimet pitää olla ? luin netissä jossain että max virrat 120A ohjain oli
entä gyroskooppi ? mistä ? miten liittää uno levyyn :open_mouth:
koodit ?
mietin että H-birge fet ohjaus kai paras noille isoille DC moottoreille,koodiesimerkkejä ? vinkkiä sivuille ?
gyron kanssa kyllä ihan pihalla kun ei aikaisempaa kokemusta niistä.
ja tuosta kalman filtteristä ??
suomeksi edes jossain jos olisi vähän enemmän infoa,enkuksi kun menee liian hankalaksi puolet yli hilseen :frowning:
mutta alkuun jos pääsisi noillakin neuvoilla uno ,edullisin ostaa ?
moottorin ohjaimet,osto ?
moottorit ?
ensin tietenkin pikkuversiona,pienillä moottoreilla arduino unolla,gyro ja koe robo seisomaan.kiitos neuvoista aloittelijalle,aikaisempaa kokemusta on vähän,picaxe:lla,ohjelmoitavilla logiikoilla teollisuudessa,ledien vilkuttelulla,eri piirien kanssa.cnc kone pc,ja askelmoottorit tehty,useita.projekteja ja myyty eteenpäin.

onko muilla kokemusta tuosta robomaa verkkokaupasta ?
näkyy olevan aina kaikki osat mitä meinaa tilata niin loppu varastosta,eli ei viitsi edes tilata kun ei tunnu olevan yhtään mitään noilla myytäväksi,harmittaa,olis moottori ohjaus shieldiä ja proto levyä ostellut hyppylankoineen muttei ole niin ei.taitaa koko kauppa olla nykyisin kuollutta painoa verkossa vai ?

Itse olen kyllä ollut robomaan palveluun enemmän kuin tyytyväinen. Joskus ollut jokin sieltä loppu mitä olin tarvitsemassa, niin laitoin mailina kyselyä että koska saavat varastoon lisää. Vastaus tuli samana päivänä ja osakin taisi tulla vielä saman viikon aikana postiin ellen väärin muista. Eli laitahan maililla kyselyä niille koska saavat täydennystä!

joo,pistän kyselyä kun seur kerran aikomus tilailla,jotenkin vain olin alkuun epäileväinen että vanhentunut ja toimimaton kauppa mutta kait sieltä saa kun kyselee joka osan erikseen sitten.pitää kattoa listaa mitä on hankinnassa vielä niin saa pistettyä kyselyn noille.

olisi pikku kysymys uudesta projektistani,jos joku tietäisi paremmin,
tilanne,kirjoitan koodia arduinolle nyt ja ulkoiset komponentit aiheuttaa päänvaivaa,eli auton akusta pitäisi saada jännitetieto polttamatta piiriä rikki,tämänhetkinen tilanne,laitan 7805 regun piirin syötölle,pari konkkaa suotimeksi,se nyt kai ok,mutta miten otan akusta mittausjännitteen analogi tulolle tuhoamatta piriä? jännitejakoa olen laskeskellut mutta kun akun jännite välillä’ voi olla 10V-16V kai maximit,joku parempi suojaus ja mittaustapa täytyy olla kun laturikin heittää varmasti piikkejä joskus.ulos tulo simppeli kyllä itelle,eli lcd näytölle tiedot,toinen halvempi vaihtoehto on ledeillä infoa punainen=tyhjä akku ei kannata yrittää käynnistää,lataukseen,keltainen,pieni jännite,vihreä=kunnossa.
tuo koodi nyt tekeillä ja toimii simulaatiossa ok.samoin lcd näytöllä jännite tila.
onkelma siis vain tuossa akun mittaamisessa nyt.arduoinohan on max input 40mA ja mietin että 20mA olisi turvallinen taso.ad tila 0-255 jännitteelle 9-16V luokkaa kait akku pyörii.kiitos jos joku osaisi tuon alkuun auttaa.

Ihan huoletta voit jakaa jännitteen vastusjaolla viidellä tai kuudella. Käytät vaikka 10k ja 50k vastuksia niin on täysin turvallista.

juu,tein pikaisesti säädettävän jännitelähteen LM317 ja ulos 4-16V niin trimmereillä tulokseksi sain sisään-vastus 8,8K ulos 5V ja maihin 4K sillä sain äkkiseltään max 16V Vin max 5V Vout jaon aikaseksi.
pitäskö tuossa vielä olla 125 vastus pin 1 jalalla että virtarajoitus toteutuisi vielä varmuuden vuoksi,JOS tapahtuu jokin piikki/vikatilanne että inputtiin syöttääkin max virtaa ?
kun mietin että 5V 0,040mA=125ohminen virtasuoja ?
mieluummin kai vois laittaa vähän alemmaksi ettei ihan maximia lykkää piirille eli pudottais puoleen 250 ohmilla. vai vaatiikohan enää kun kerran alussa on jo tuo 8,8K ohmia.
eihän auton akku nyt 16V anna mutta laturin kanssa voi välillä heittää jopa 16v,nominal max,about muistaakseni laturin kanssa 15,6V-14,2V

Laita vaan suosista suurempi skaala ja muit vastuksia et tarvitse. Se useampi kilo siinä edessä rajottaa virran jo alle milliampeeriin, joten se 125 ohmia ei paljoa enää siinä vaikuta :slight_smile:

Olen teg:n kanssa samaa mieltä.

Jos haluat suojata AD-inputtia vielä esd:ltä, niin kytke schottcky-diodi ad-inputista käyttöjännitteeseen päin ja maasta ad-inputtiin päin (eli 2 kpl diodeja). Tämä on hyvä ja yleinen käytäntö muutenkin tulojen suojaamisessa. Puhutaan clamp-diodeista tällöin, tässä linkki jos haluaa opiskella aihetta: whites.sdsmt.edu/classes/ee320/n … cture9.pdf

kiitos,tuo nyt ok :smiley:
uusi ongelma TAAS :slight_smile:
jos nopeus kiekko antaa 4 pulssia hall anturille/kierros,(sain hall anturin vilkuttamaan lediä kun kiekon magneetit4kpl ohittaa anturin) miten ihmeessä saan arduinon laskemaan ja näyttämään tuloksen kpl määrä/sekuntti :open_mouth: tai ensin nyt edes kpl määrä / ison pyörän 1 kierros.

miksihän noissa kiekoissa on kiinteänä 4 magneettia kun käsittääkseni yksi olisi ihanteellinen,simppeli ? ei saa 3 poistettua.yhtenäinen massa.

välityssuhdetta en tiedä,anturi kiekko noin 2cm halkaisija ja iso pyörä jotain 50cm,mutta vaihdetta/välityssuhdetta en tiedä,siksi ensin laskuri,montako pulssia /yksi kierros,pyöräytän isopyörää 1R ja katson montako pulssia tuli näytölle.

sorry jos meni selitys vähän vaikeasti kun itelläkin vähän hakusessa miten tämän selittäisi ja sisäistäisi :slight_smile:

kuinkahan tiuhaa pulssia tuo arduino/hall anturi pystyy laskemaan todella nopeassa pyörimisessä.kun jos mittakiekon nopeus todella suuri niin sehän näyttää kuin yhtenäistä viivaa ? anturin tyyppi TLE4905L
toinen oli epäherkkä/sekava tel4935L ei niin hyvin.tunnistanut.

Hei!

Pulssien laskemiseen tarvitset mikrokontrollerin timeria… taikka voit tehdä sen myös logiikkapiireillä ja säästää näin mikrokontrollerin cpu-aikaa :wink:

Jos kiekosta saadaan 4 pulssia per kierros, niin se tarkoittaa tietysti 4 hertsin taajuutta, jolloin kiekon pyörimisnopeus on 1 kierros sekunnissa ja 60 kierrosta minuutissa jne. (r/s = revolutions / second)

Mikrokontrollerilla jonkin signaalin taajuuden laskeminen tapahtuu käyttämällä siis timeria. Timerille syötetään jokin tunnettu kellotaajuus esimerkiksi kiteeltä ja kiekolta tuleva pyörimisnopeuden taajuuspulssi syötetään mikrokontrollerin pinniin joka on kytketty timerin inputtiin (mahdollisesti keskeytyspinnejäkin voi käyttää). Sitten mitataan tietty aika ja lasketaan montako pulssia pyörivä kiekko antaa… Hätäinen selitys, pahoittelen. Enemmän aiheesta mm. seuraavalla sivulla: best-microcontroller-project … unter.html

Logiikkapiirejä käyttämällä voit käyttää laskuripiirejä ja jakajia tarvittaessa. Jos haluat kokeilla logiikkapiiriä taajuuden laskemiseen, voit kokeilla 4-bit counteria, jolloin aina 4 pulssin jälkeen saadaan kytkennästä ulos 1 pulssi, joka on helpompi taas laskea vaikkapa mikrokontrollerilla tms… Lisää tästä: electronics-tutorials.ws/cou … unt_3.html

Nopeuksista en osaa tarkasti sanoa, mutta yleisesti ottaen maksiminopeus mitä voi mitata riippuu käytetyistä kellotaajuuksista kun käytetään mikrokontrolleria. Logiikkapiireillä signaalien nousunopeus on rajoittava tekijä.

Atmelilla joskus leikein tätä asiaa. Päädyin lukuun 1/20 kellotaajuudesta, kun käytti Normaalia ISRää.
keskeytys, kontekstin vaihto, pinnin luku, lasku, tuloksen tallennus, paluu, kontekstin vaihto. 20 yhden kellosyklin käskyä.

Keskeytys oli siis jotain muotoa

(PIND & (1 << 0)) ? ++laskuri: --laskuri; //laskuri++ ois hitaampi muistaakseni

Pienellä ASMittelulla pääsin 1/16 kellotaajuudesta ja se riitti mulle. Kyseessä oli siis rotaryencoder ja noita tuli 3600/kierros. Lisäksi päästiin törkeeseen tarkkuuteeen :slight_smile:

hmm,vähän menee yli hilseen nyt aloittelijalle,kun ei ole aikaisemmin counterit ja timerit oikein vastaan tullut,mutta yritän ettiä googlella jotain esimerkkiä,onnistuisikohan jollain arduino RPM meter projectin koodilla kun muuttaisi sitä hieman ?
noita kyllä jokunen näkyi olevan,tosin en ihan ymmärtänyt koodia täysin.

ja miksihän tuo digital hall sensor on niin epäherkkä,pitää olla todellakin kiinni kiekossa että tunnistaa(ledi syttyy) millin kun liikahtaa hall anturi kauemmas niin ei tunnista :frowning:
esimerkki,auton nopeusmittarin sisällä vastaava kiekko jossa pulssi 4/R,mutta auton oman hall anturin kotelon paikka noin 25mm päässä kiekosta(mittarin sisällä) kun tämä minun hall pitää olla kiinni kiekossa että tunnistaa,eikä tietoakaan mitä hall tyyppiä auton mittarissa voisi olla käytetty.
onko analogi hall herkempi tuollaiseen/ottaa kauempaa ?
jos sellaisia tilaisi jostain ja kokeilisi.

hall nyt kytkettynä erään esimerkin mukaisesti bull -up resistorin kanssa digi inputtiin,resistorin koolla väliä ? nyt noin 40k vastus,esimerkki kytkennän mukaisesti,olikohan hall sensor arduino tutorial sivulta tuo minun kokeilu kytkentäni.
meinasin että muuttuuko herkemmäksi tunnistus jos vastus +5V ja digital input:in välillä pienempi ,esim,20k,10k ??? (parempi kysyä ensin, kuin rikkoa kokeillessa summassa jotain,arduino unoa tai anturia )

ongelmana siis tuo herkkyys ja laskeminen r/s=km/H pyörän halkaisijapii2=matka/r*hour=km/H ??? tai jotain tollasta,hmmm
, ja riittääkö nopeus laskea pulsseja todella nopealla kierrusluvulla.

harmi kun kaikki enkuksi netissä niin ei ihan uudet asiat mene jakeluun kun eri kieli ja uusi asia ,uudet sanat :frowning: ei saa tolkkua :frowning: siks olinkin aluksi innoissani että tällainen paikka ni saa ymmärretysti jotain apua uudessa asiassa opettelussa.

Ehkä tyhmä kysymys, mutta millaista kiekkoa hall-anturi haistelee ?
Senhän täytyy olla magnetoitu tai sitten hammastettu levy magneettisesta materiaalista, jonka hampaat on magneetin ja anturin välissä.

pari suht samanlaista kiekkoa on käytössä,toinen auton nopeusmittarin sisällä oleva harmaa massakiekko ja siinä näkyy olevan 4 magneettista pistettä kun pyörittää mittarin vaijerin reijästä kiekkoa.
samanlainen näkyy olevan robotin vaihteistossa,myös 4 magneettista pistettä jolloinka saa 4 high lediä kun testikytkennän ja koodin tein.täys massaa erillisiä magneetteja ei näe silmällä kyllä missään.

robotin vaihteisto ja moottorit pyörineen purettu jostain vanhasta AUTOLELUSTA AIKOINAAN,UMPEEN VALETTUA KAMAA MUTTA 2 DC MOOTTORIA JA METALLINEN(ÄÄNESTÄPÄÄTELLEN)vaihteistot.
reikä kiekon kohdalla mistä sain hall anturin kiekon lähelle,digitaalinen vain joutuu olemaan todellakin kiinni kiekossa että tunnistaa,tänään testasin analogisen hall antrurin, toimii kauempaakin kun tuollaista gaus koodia kokeilin ard,tutorial sivuilta,notrh pole ja south pole näyttää serial monitorissa ja lukemia +49,0,-39 eli vaihtelee magneetin mukaan.

eli aika mielenkiintoinen boardi tämä arduino, on koska yhtä projectia aloittaessa on jo poikinut mahdollisuuksia tuohon auton nopeusmittariksi ja robon nopeus mittariksi ja tietoa lisää hall antureista ja monenlaista kokeilua ollut ymmärtämiseen ja uuden oppimista,eli suoraan sanoen kivaa,tosin nuo ei vielä aukea oikein miten pulssin laskenta esm,juuri robon vaihteisto=nopeus,ja myöhemmin vielä auton nopeus,kierrosnopeus koodia kyllä löytyy useita,niistäkään en täysin vielä perillä ,miksi se lasketaan tuon kanssa tms :slight_smile: kunhan LCD näyttö ja muut tilpehöörit tulee robomaalta joskus niin saa TAAS uutta opittavaa,ja miten nuo gyro ja acceletometerit oikein toimii :slight_smile:
haaveena että joskus vielä olisi segway toiminnassa :slight_smile:
ja mikä ihme tuo kalman filtteri juttu oikein on,kun suomeksi ei löydy mitään luettavaa :frowning:

nopeus näytöllä ja muilla lisukkeilla :smiley:
kun tuli tämä hall ja nopeus nyt ekana kun oli hall anturia ja lämpötila sensoria vanhastaan miljoona laatikossa.itselle kun saa nämä ensin sisäistettyä niin on kiva taas opettaa muillekin ja etenkin alaluokkien innokkaille oppilaille näitä.monta todella innostunutta lasta jo kimpussa kokoajan :slight_smile:
tuo lähinnä sellaista vapaaehtoistyötä.iltaisin.
mutta kiitos nyt näistäkin vähästä neuvoista niin pääsee edes alkuun.

Magneettikentän vahvistamista voi kokeilla laittamalla rautapala ( esim ruuvi ) hall-anturiin kiinni siten, että anturi on palan ja levyn välissä.