Sonar krage för blinda hundar (3 / 5 steg)

Steg 3: programvara



Det första steget till att få programmet att fungera är att öppna ett nytt textdokument och klistra in följande:

< p > #ifndef _I2CMASTER_H < br > #define _I2CMASTER_H 1
/*************************************************************************
* Benämning: C inkluderingsfil för I2C ledar-gränssnittet
* (i2cmaster. S eller twimaster.c)
* Författare: Peter Fleury
< pfleury < en href = "http://jump.to/fleury" >< en href = "http://jump.to/fleury" > http://jump.to/fleury

< /a >
< /a >
* Fil: $Id: i2cmaster.h,v 1.10 2005/03/06 22:39:57 Peter Exp $
* Programvara: AVR-GCC 3.4.3 / avr-libc 1.2.3
* Mål: alla AVR enheter
* Användning: se Doxygen manual
**************************************************************************/</pfleury DOXYGEN
/**
pfleury_ic2master I2C Master bibliotek
#include < i2cmaster.h >

I2C (TWI) Master mjukvarubibliotek < /i2cmaster.h >< /p >< p > grundläggande rutiner för att kommunicera med I2C slav enheter. Denna enda hanterare
genomförandet är begränsad till en buss master på I2C bussen. < /P >< p > detta I2c bibliotek är implementerad som en kompakt assembler programvara genomförandet av I2C-protokollet
som körs på någon AVR (i2cmaster. S) och som en TWI hårdvara gränssnitt för alla AVR med inbyggd TWI maskinvara (twimaster.c).
Eftersom API för dessa två implementationer är exakt samma, ett program kan kopplas antingen mot den
programvara I2C genomförande eller maskinvaran I2C genomförandet. < /p >< p > Använd 4.7 k pull-up resistor på SDA och SCL PIN-koden.

Anpassa SCL och SDA hamnen och pin definitioner och så småningom dröjsmål rutin i modulen
i2cmaster. S till ditt mål när du använder programvara I2C genomförandet!

Justera CPU klocka frekvens F_CPU i twimaster.c eller i Makfile när du använder den TWI hårdvara implementering. < /p >< p >
Modul i2cmaster. S är baserat på Atmel ansökan Obs AVR300, korrigerat och anpassas
GNU assembler och AVR-GCC C samtal gränssnitt.
Ersatt det felaktiga kvartalet periodens förseningar Funna i AVR300 med
halva perioden förseningar.

Peter Fleury pfleury < en href = "http://jump.to/fleury" >< en href = "http://jump.to/fleury < / a" > http://jump.to/fleury

< /A >>< /p >< p > API-användning exempel
Följande kod visar typisk användning av detta bibliotek, se exempel test_i2cmaster.c < /p >< p > #include < i2cmaster.h >< /i2cmaster.h >< /p >< p > #define Dev24C02 0xA2 / / enhetens adress för EEPROM 24C 02, se datablad < /p >< p > int main(void)
{
unsigned char ret; < /p >< p > i2c_init(); initiera I2C biblioteket < /p >< p > / / skriva 0x75 till EEPROM adress 5 (Byte skriva)
i2c_start_wait(Dev24C02+I2C_WRITE); Ange enhetens adress och skriva läge
i2c_write(0x05); Skriv adress = 5
i2c_write(0x75); Skriv värdet 0x75 till EEPROM
i2c_stop(); ställa in stop conditon = release buss < /p >< p > / / Läs tidigare skrivit värde tillbaka från EEPROM adress 5
i2c_start_wait(Dev24C02+I2C_WRITE); Ange enhetens adress och skriva läge < /p >< p > i2c_write(0x05); Skriv adress = 5
i2c_rep_start(Dev24C02+I2C_READ); Ställ in enhetens adress och läsa sätt < /p >< p > ret = i2c_readNak(); läsa en byte från EEPROM
i2c_stop(); < /p >< p > for(;;);
}

#endif / * DOXYGEN * < /p >< p > ** (__GNUC__ * 100 + __GNUC_MINOR__) < 304
#error "detta bibliotek kräver AVR-GCC 3.4 eller senare, uppdatera till nyare AVR-GCC kompilator!"
#endif < /p >< p > #include < avr io.h= "" >< / avr >< /p >< p > / ** definierar data riktning (behandlingen från I2C enhet) i i2c_start(),i2c_rep_start() * /
#define I2C_READ 1 < /p >< p > / ** definierar data riktning (skriver till I2C enhet) i i2c_start(),i2c_rep_start() * /
#define I2C_WRITE 0 < /p >< p > / **
initiera I2C master interace. Behöver bara anropas en gång
void
ingen
*/
extern void i2c_init(void); < /p >< p > / **
Avslutar överföringen av uppgifter och släpper I2C bussen
void
ingen
*/
extern void i2c_stop(void); < /p >< p > / **
Utfärdar ett tillstånd som start och skickar adressen och överföring riktning

addr adress och överföring riktningen av I2C-enhet
0 enhet tillgänglig
Det gick inte att komma åt enheten 1
*/
extern unsigned char i2c_start (unsigned char addr); < /p >< p > / **
Utfärdar ett tillstånd som upprepade start och skickar adressen och överföring riktning < /p >< p > addr adress och överföring riktningen av I2C-enhet
0 enhet tillgänglig
Det gick inte att komma åt enheten 1
*/
extern unsigned char i2c_rep_start (unsigned char addr); < /p >< p > / **
Utfärdar ett tillstånd som start och skickar adressen och överföring riktning

Om enheten är upptagen, använda ack polling vänta tills enheten redo
addr adress och överföring riktningen av I2C-enhet
ingen
*/
extern void i2c_start_wait (unsigned char addr); < /p >< p >
/**
Skicka en byte till I2C enhet
databyte som skall överföras
0 Skriv framgångsrika
1 skrivning misslyckades
*/
extern unsigned char i2c_write (unsigned char data); < /p >< p > / **
läsa en byte från I2C-enheten, begär mer data från enheten
byte läsa från I2C enhet
*/
extern unsigned char i2c_readAck(void); < /p >< p > / **
läsa en byte från I2C-enheten, följs Läs av ett stoppvillkor
byte läsa från I2C enhet
*/
extern unsigned char i2c_readNak(void); < /p >< p > / **
läsa en byte från I2C-enheten

Genomföras som ett makro, som appeller antingen i2c_readAck eller i2c_readNak

Ack 1 skicka ack, begär mer data från enheten < br >
0 skicka nak, Läs följs av ett stoppvillkor
byte läsa från I2C enhet
*/
extern unsigned char i2c_read (unsigned char ack);
#define i2c_read(ack) (ack)? i2c_readAck(): i2c_readNak(); < /p >< p > / **
#endif < /p >

Spara filen som i2cmaster.h

Nästa öppen upp den Arduino programvaran och skapa ett nytt program med följande kod:

#include < i2cmaster.h >

byte clockPin = 12;
byte buf [9]; //Buffer att lagra den mottagna valeus
byte addr = 0x02, //address 0x02 i ett 8-bitars sammanhang - 0x01 i 7-bitars sammanhang
byte avstånd; < /p >< p > void setup()
{
i2c_init (); //I2C frekvens = 11494,253 Hz
Serial.BEGIN(9600);
printUltrasonicCommand (0x00); //Read Version
printUltrasonicCommand (0x08); //Read produkt-ID
printUltrasonicCommand (0x10); //Read sensortyp
printUltrasonicCommand (0x14); //Read måttenheter
pinMode(13,OUTPUT);
}
< /p >< p > void loop()
{
printUltrasonicCommand (0x42); //Read mätning Byte 0

avståndet = readDistance();
IF(Distance == 0xFF)
Serial.println ("fel läsavstånd");
annat
Serial.println (avstånd, DEC);
IF(Distance<30) {
Tone(13,4000);
Delay(200);
noTone(13);
}
}
byte readDistance()
{
fördröjning (100); //There måste vara en fördröjning mellan kommandon
byte cmd = 0x42; //Read mätning Byte 0

pinMode (clockPin, ingång), //Needed för att skriva att arbeta
digitalWrite (clockPin, hög);

IF(i2c_start(addr+I2C_WRITE)) //Check om det finns ett fel
{
Serial.println ("fel i2c_start");
i2c_stop();
returnera 0xFF;
}
IF(i2c_write(CMD)) //Check om det finns ett fel
{
Serial.println ("fel i2c_write");
i2c_stop();
returnera 0xFF;
}
i2c_stop();

delayMicroseconds (60), //Needed för att ta emot arbete
pinMode (clockPin, produktionen);
digitalWrite (clockPin, låg);
delayMicroseconds(34);
pinMode (clockPin, ingång);
digitalWrite (clockPin, hög);
delayMicroseconds(60);

IF(i2c_rep_start(addr+I2C_READ)) //Check om det finns ett fel
{
Serial.println ("fel i2c_rep_start");
i2c_stop();
returnera 0xFF;
}
för (int jag = 0; jag < 8; i ++)
BUF [i] = i2c_readAck();
BUF [8] = i2c_readNak();
i2c_stop();

returnera buf [0];
}
void printUltrasonicCommand(byte cmd)
{
fördröjning (100); //There måste vara en fördröjning mellan kommandon

pinMode (clockPin, ingång), //Needed för att skriva att arbeta
digitalWrite (clockPin, hög);

IF(i2c_start(addr+I2C_WRITE)) //Check om det finns ett fel
{
Serial.println ("fel i2c_start");
i2c_stop();
hemkomst.
}
IF(i2c_write(CMD)) //Check om det finns ett fel
{
Serial.println ("fel i2c_write");
i2c_stop();
hemkomst.
}
i2c_stop();

delayMicroseconds (60), //Needed för att ta emot arbete
pinMode (clockPin, produktionen);
digitalWrite (clockPin, låg);
delayMicroseconds(34);
pinMode (clockPin, ingång);
digitalWrite (clockPin, hög);
delayMicroseconds(60); < /p >< p > if(i2c_rep_start(addr+I2C_READ)) //Check om det finns ett fel
{
Serial.println ("fel i2c_rep_start");
i2c_stop();
hemkomst.
}
för (int jag = 0; jag < 8; i ++)
BUF [i] = i2c_readAck();
BUF [8] = i2c_readNak();
i2c_stop();

om (cmd == 0x00 || cmd == 0x08 || cmd == 0x10 || cmd == 0x14)
{
för (int jag = 0; jag < 9; i ++)
{
om (buf [i]! = 0xFF & & buf [i]! = 0x00)
Serial.Print(BUF[i]);
annat
bryta;
}
}
annat
Serial.Print (buf [0], DEC); < /P >< p > Serial.println("");
}
/*
"Ledningar på NXT jack kontakt.
"Tråd färger kan variera. Stift 1 är alltid slutet närmaste spärren.
' 1 vit + 9V
"2 black GND
"3 röda GND
"4 grön + 5V
"5 gula SCL - även ansluta clockpin för att ge en extra låga impuls
"6 blå SDA
"Använd inte i2c pullup motstånd - redan finns inom sensor.
* / < /p >

Kontrollera och kompilera koden på din Arduino. Om du får en fel göra säker som den i2cmaster.h filen är tillgänglig av Arduino koden.

Du kan justera avståndet från vilken den pipa kommer att ske genom att sänka eller höja värdet i if(distance<30) skick.

Se Steg
Relaterade Ämnen

Ultraljud sonar för blinda och synskadade

IntroduktionDenna artikel är avsedd att visa hur att bygga och använda en tillgänglighet enhet jag har utformat för att hjälpa människor som är på olika nivåer av synnedsättning. Tanken bakom enheten är att använda en Ultraljuds avståndsmätare sensor...

KLICKARE utbildning grunderna

ta en stund att läsa följande vägg av text. Jag kommer att definiera ett antal begrepp som får följa med lättare.Operant beteendeEtt beteende som väcker en följd kallas en operant beteende. Operant betingning är inriktad på förhållandet mellan olika...

YourDuino: HandBat - handhållen ultraljud Radar genom att använda Arduino

HandBat är en handhållen ultraljud Radar enhet som sänder ut pulser av ultraljud och lyssnar efter ekon, som en Bat. Det är avsett för användning av synskadade människor eller navigering i mörkret.Handbat är inrymt i en billig ($3,97) Rayovac svävand...

Bekväm päls spara läder hund krage

När jag designade denna krage, jag konstruerade det med fem kriterier, i åtanke, och som gick in i dess konstruktion. Det måste vara stark, lätt vikt, justerbar, bekväma och päls spara. För att göra det ljus jag använt 2-3 oz. vegetabiliskt garvat lä...

Dator sonar att spara energi.

Du förmodligen minns gamla ubåt filmer när du ska hitta några fartyg runt dem, de skulle skicka ut ett ljud som lät som en ping och sedan väntade ljud reflektion att komma tillbaka. Det är vad vi ska göra. Detta bör ha en större känslighet (som alla...

10 minuters hund krage

inte känner för att spendera $60 för en anpassad hund krage? Gör en gratis – på kortare tid än det tar för att avsluta en kopp kaffe.Steg 1: Samla leveranser Vad du behöver:HundGamla remmenSlag med extra hål ända till slutet kommer att snabbast, men...

5 saker alla hundar bör veta

vi alla vill ha en väluppfostrad hund; särskilt om du har barn, grannar, familj och eventuellt en tjej/kille vän. Vilka är grunderna för att en bra hund?Det finns många saker varje hund bör veta, men tråkigt nog som vi alla vet att det finns en massa...

Justerbar Paracord hund krage

Detta är att visa dig hur man gör en justerbar krage för din hund av paracord. En dag jag tänkte hur man gör en krage som kan justeras när din hund växte eller fick lite tyngre utan att behöva göra en ny krage. Detta är vad jag kom med!Steg 1: Start...

Alternativ till den elisabetanska krage

elisabetanska krage är klar plast koner placeras över huvudet på ett djur för att hindra dem från kliar eller slickar ett sår (se 3: e bilden). Även om E-krage effektiva kan de också orsaka djuret mycket stress. E-krage begränsa perifera seendet orsa...

El Wire hund krage & koppel!

Har du någonsin velat ha din hund stå i mängden? Ja nu kan din hund vara stjärnan i parken med mycket egen El wire krage och koppel! Låt din hund känner att han eller hon har stil med denna stora gåva för dina lurviga lilla vän.Verktyg:* Nål* Sax (el...

GoPro hund krage

hundar är fantastiska. Någon som har haft en vet exakt vad jag talar om. Så har du någonsin varit intresserad av att se livet hur din fyrbenta vän ser det? Bra efter lite experimenterar finns det slutligen ett enkelt sätt att göra just detta.Här är n...

"Jeweled" hund krage från en gammal bälte

Hundhalsband läder är så dyra, men min bestar vilja ha något fint att bära. Eftersom någon i mitt hus verkar alltid att bära ut ett bälte, tänkte jag skulle prova några återanvändning och göra min egen kragar. Denna design använder epoxi för att göra...

Cykling bly för hundar

min hund Lucky är halv tysk herde och halva Border Collie. Hans förfäder tillbringade hela dagen springer runt kullarna, omväxlande vallning stora flockar av får och skydda dem från vargar.Problemet är, hans energi nivåer är desamma som hans förfäder...

Krage keeper

Min Chihuahua har alltid haft en känslig del av halsen där spännet av hennes krage gnuggar mot hennes päls som orsakar håravfall och irritation. Efter att ha provat ut flera kragar med spännen jag kom med en idé för en liten läder bit passar som jag...

Vegan översållad hund krage för under $10!

Om du är vegan men du vill en hund krage, vinyl som kan vara lika dyrt som sina motsvarigheter i läder. De är också typ av obekväma och kliande stick din-huden så att alla vinyl är. Här är ventilerande, tvättbara och bäst av allt, Billigt. Om du har...

Paracord hund krage, Halti krage

det finns hundratals instructables som utnyttjar paracord och det är verkligen en mångsidig produkt.Jag har några här själv inklusive ett paracord rescue bälte och en paracord multitool påse!Jag skulle verkligen uppskatta din röster för nuvarande par...

Tips på walking hundar som verkligen fungerar!

Har jag samlat lite matnyttigt på walking hundar både av TV och personliga erfarenhet här några tips. Tips att du verkligen kommer att använda från både "Dog Whisperer" TV-show, och jag själv. Välkommen att ställa frågor om din hund eller hund i...

Upcycle A läder kuter in A hund krage med 5 minuter eller mindre

detta är ett häftigt sätt att använda upp trasiga eller gamla bälten som du har i din garderob. Och ja, du kan göra denna krage i fem minuter. Den mest tidskrävande delen av detta instructable försökte få Jersey bo fortfarande för bilder.Om du älskad...

Blinkande LED hund saftey krage!

i detta jag visa dig hur du gör din egen hund säkerhet krage! dess idealisk för natt promenader och tillfällig glädje kör. Ibland min hund blir lös och bestämmer sig för att köra på gatorna, min största rädsla är honom att bli påkörd av en bil och vi...