Xbox
Even the dark has a silver lining | I'm all you can imagine times infinity, times three
1
2
| if(digits < 10) Serial.print('0'); |
zou hetzelfde moeten doen als
1
2
3
4
| if(digits < 10) { Serial.print('0'); } |
Dus theoretisch zou de uitvoer op de serial monitor wel goed moeten zijn en de LCD niet.
if (!coffee) {
Work = false; }
After the first glass you see things as you wish they were. After the second you see things as they are not. Finally you see things as they really are, and that is the most horrible thing in the world...
Oscar Wilde
Mijn programmaatje (dat ik eerst voor de PC had geschreven om te testen) draait nu ook op mijn Arduino Mega
Ik maakte me eerst de meeste zorgen over de snelheid van de Atmel's, mijn programma moet namelijk minstens 10x per seconde een rondje kunnen draaien en ik vroeg me af of dat haalbaar was. Dat bleek niet nodig : mijn Mega draait nu alles met +- 80 rondjes per seconde af! Ik kan de Arduino dus zelfs nog een flink eind terugklokken!!!
Mijn tweede punt van zorgen was de hoeveelheid flash, ik was bang dat ik niet genoeg zou hebben aan 30K (ik weet dat de Mega veel meer heeft, maar ik zou alles het liefst in een Nano gaan draaien). Dat bleek ook niet nodig, de binary is nu 24.078 bytes (en als ik compileer voor Nano, zelfs nog iets kleiner :22.410 bytes. Weet iemand waar dat verschil van komt?!).
Waar ik me nooit zorgen over maakte : het gebruikte geheugen. En dat had ik nu juist wel moeten doen, want dat bleek dus uiteindelijk het heikele punt. Mijn programma wilde niet draaien op mijn Mega en ik snapte niet waarom... Uiteindelijk maar begonnen met strippen, functieaanroepen verwijderen en opeens werkte het... (nou ja, de alive-LED knipperde nog..) Nog wat prutsen later bleek dat het dus niet lag aan de functies die ik had verwijderd, als ik ze weer terugzette en andere weghaalde werkte het nog steeds.. Er begon me iets te dagen, en heb iets toegevoegd dat het verschil tussen de stack en de heappointer berekend en op de seriële poort zet.. en tja.. nog maar een paar honderd bytes over...
Ben nu de hele dag bezig geweest om het geheugengebruik terug te dringen, INT->CHAR en waar mogelijk alle bits van een INT gebruiken ipv meerdere arrays. Arrays-voor-het-gemak verwijderd en opgelost met extra code. Ik heb nu nog 3130 bytes over van de 8K.
Als ik dus nog 3K extra weet vrij te maken, dan gaat alles ook werken in een Nano (net aan), want de Nano is net zo snel, en de code past in 30K.
Ik had wel nog een paar vragen :
1) Kan ik mijn DS1307 ook gebruiken op een nano? Er zijn geen speciale SDA/SCL pinnen..
2) Het valt me op dat zodra ik een seriële poort definiëer op mijn Mega, ik zelf geen controle meer heb over de RX1,TX1,RX2,TX2,RX3 en TX3 pinnen. Maar ik heb genoeg aan 1 seriële poort (RX0 en TX0) en zou de andere 6 pinnen graag zelf nog willen gebruiken.. (eigenlijk zou ik RX1 en TX1 willen gebruiken om de klok te voeden).
3) Mijn applicatie loopt nu op maximale snelheid, 80 rondjes per seconde, maar ik wil maar 10 rondjes per seconde. Wat zou het makkelijkste zijn? werken met een interrupt of simpelweg iets maken met de functie millis()? Aan de andere kant : ik wil eigenlijk 10x iets doen per seconde van de RTC, en niet 10x op basis van de klok van de Arduino, want anders lopen dingen ongelijk. Ik zie het zo voor me :
mainloop
- wacht op seconde overgang van RTC
- lees aantal millis() (<-- eigenlijk zou het handiger zijn om het aantal millis op 0 te zetten, ivm overlopen)
- draai een rondje
loop 9x
-> wacht tot millis 100 hoger is, draai dan een rondje
terug naar mainloop
4) het valt me op dat de RTC niet super is.. In 2 weken tijd loopt de RTC 3 minuten voor. Dat is dus meer dan een uur per jaar. Niet acceptabel
5) Hoe klok ik mijn Arduino terug en (als ik dat doe), werkt de serïele communicatie en two-wire communicatie dan nog?
pfroet..
/me heeft eindelijk ook een icoontje.. woef.. boeien..
2) geen idee... lees de hardware pagina op de arduino website even door.
3) ja zelf een timeout maken met millis() is het handigst. Gaat 1x in de 52 dagen een keer fout omdat millis() overloopt, dat is wel te overleven toch?
4) dan moet je er een nauwkeuriger kristal op solderen
5) een tragere oscilator erop solderen. Denk dat je met je seriele communicatie de baud-rates moet omrekenen en de wire-library kun je misschien zelf aanpassen.
Mijn baas heeft zo'n unit besteld voor een energiebesparing projectje:
http://www.sigma-shop.com...ller-one-channel-box.html
Een relay die je via USB kunt besturen dus.
zit gewoon een FTDI en een ATtiny chip op, dus basically een soort versimpelde arduino. Zou wel leuk zijn om 'm als tijdrelais te programmeren om te voorkomen dat mensen gaan kutten door dat ding tig keer achter elkaar aan- en uit te zetten.
[ Voor 29% gewijzigd door mcDavid op 20-01-2013 21:21 ]
Hoi, Ik ben schrijver van de DCF77 bibliotheek waar je naar refereert. Het DCF signaal is een lastig signaal om goed te ontvangen: het is een lange golf signaal dat amplitude gemoduleerd is), en dat geeft een heleboel mogelijkheden tot ruis.Raven schreef op zondag 13 januari 2013 @ 14:58:
Nu ben ik met de DCF ontvanger van Conrad bezig. So far no luck
De sketch van http://thijs.elenbaas.net...io-clock-receiver-library blijft continu in de jaren 70 zitten, wordt dus niet op tijd gezet. ...
Nu draait die code, produceert de nodige output, maar de goede tijd helaas nog niet.
Heb je ook de sketches geprobeerd om te kijken hoe goed je signaal is?
Er is een sketch die je het ruwe signaal laat zien:

En een sketch die je de puls tijden geeft

Uitleg over het interpreteren vindt je hier:
http://thijs.elenbaas.net...io-clock-receiver-signal/
Typisch hebben de problemen te maken met stoorsignalen die binnenkomen via de voeding of via de antenne. Je kan het signaal proberen te optimaliseren terwijl je een van bovenstaande sketches draait:
- Sluit een pull-up weerstand aan - dit heeft niet met ruis te maken, maar wordt soms vergeten
- Gebruik een capacitieve bypass op de voeding - dit dempt stoorsignalen, zie schema op http://thijs.elenbaas.net...lock-receiver-hardware-2/
- Pas de oriëntatie van de antenne aan - het signaal komt vanuit Duitsland
- Gebruik 2 aard draden, twist er een met de voeding, en de ander met de signaal draad. - Dit verminderd door inductie opgepikte signalen
- Leg je ontvanger niet te dicht bij je PC of voeding.
- Voed je Arduino vanaf een batterij
ps. De library is hier te vinden: http://thijs.elenbaas.net...o-clock-receiver-library/. Ik ben met een versie bezig die nog robuuster is tegen ruis,

Maar als je wat verder leest in dit topic, sinds ik een andere interrupt pin dan pin 2 gebruik werkt het, pin 2 bleek in gebruik door het ethernet shield en daardoor dwars te liggen...
Maar ondanks dat het werkt even op jouw punten te reageren:
- Sluit een pull-up weerstand aan - dit heeft niet met ruis te maken, maar wordt soms vergeten
Had ik meteen gedaan, zoals op jouw site staat.
- Gebruik een capacitieve bypass op de voeding - dit dempt stoorsignalen, zie schema op http://thijs.elenbaas.net...lock-receiver-hardware-2/
Ook vanaf het begin gedaan.
- Pas de oriëntatie van de antenne aan - het signaal komt vanuit Duitsland
Tsja, deze is wat lastig. Kwam laatst een Franse website tegen die aangaf dat de antenne 90 graden gedraaid moest worden bij het richten op de zendmast. Dus loodrecht op de richting daarnaar toe.
http://www.mon-club-elec....rielCapteurModuleDCF77Pro
"La bâtonnet de ferrite doit idéalement être perpendiculaire à la direction de la ville de Francfort d'où est émis le signal. "
Dat is dan ook meteen de enige site die dat aangeeft, de rest die ik heb gezien zeggen niks over het positioneren.
- Gebruik 2 aard draden, twist er een met de voeding, en de ander met de signaal draad. - Dit verminderd door inductie opgepikte signalen
Hoe doe je dat als je geen randaarde ter beschikking hebt?
- Leg je ontvanger niet te dicht bij je PC of voeding.
Toen ik er eenmaal achter kwam dat ik een in gebruik zijnde interrupt pin gebruikte en een andere pakte werkte het meteen, ook ondanks dat mijn pc + de 9v adapter er minder dan 1 meter vandaan waren.
- Voed je Arduino vanaf een batterij
Geprobeerd, Arduino valt gelijk weer uit. Uitgangsspanning van 9v blok misschien te laag(?).
[ Voor 77% gewijzigd door Raven op 21-01-2013 11:01 ]
After the first glass you see things as you wish they were. After the second you see things as they are not. Finally you see things as they really are, and that is the most horrible thing in the world...
Oscar Wilde
Over de antenne, je franse informatie is correct. Monopool en dipool antennes (waar draadjes onder vallen) hebben geen ontvangst in het verlengde van de antenne, en maximaal haaks op de antenne.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
| DrvSensTach = 0; for (int i=0; i<256; i++) { MoveBackward (i); delay (5); } Serial.println ("MoveBackward 255"); while (DrvSensTach < 30) //wait until tach reaches 30 { } Serial.println ("MoveBackward 200"); MoveBackward (200); while (DrvSensTach < 50) //wait until tach reaches 50 { } Serial.println ("MoveBackward 127"); MoveBackward (127); while (DrvSensTach < 60) //wait until tach reaches 60 { } Serial.println ("Brake"); Brake(); |
7.18v aldus multimeter.... Heb al eens gemerkt dat deze blokjes (Ansmann) niet zo heel erg geweldig zijn, 9v Eneloops heb ik nog niet kunnen vinden.furby-killer schreef op maandag 21 januari 2013 @ 11:37:
Dan moet je 9V blok echt dood zijn, want die mag wel wat minder dan 9V zijn voordat arduino het niet doet.
Over de antenne, je franse informatie is correct. Monopool en dipool antennes (waar draadjes onder vallen) hebben geen ontvangst in het verlengde van de antenne, en maximaal haaks op de antenne.
After the first glass you see things as you wish they were. After the second you see things as they are not. Finally you see things as they really are, and that is the most horrible thing in the world...
Oscar Wilde
compileert dat met al die puntkomma's achter je whiles? haal ze iig eens weg.almightyarjen schreef op maandag 21 januari 2013 @ 11:40:
Ik probeer een simpel stukje code werkend te krijgen, maar ik krijg het niet voor elkaar. Ik wil een motor met rotatie encoder opstarten, een stukje laten lopen en dan weer in 3 snelheden laten afremmen (om zo de eindpositie precies te halen). Het opstarten gaat zonder problemen, maar op de één of andere manier gaat hij niet afremmen, terwijl de pulsen van de rotatie encorder (DrvSensTach) wel doorlopen. De Serial.prinln ("MoveBackward 200") wordt niet weergegeven. Wat gaat er fout?Is het iets met die while-loops?
code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 DrvSensTach = 0; for (int i=0; i<256; i++) { MoveBackward (i); delay (5); } Serial.println ("MoveBackward 255"); while (DrvSensTach < 30) //wait until tach reaches 30 { } Serial.println ("MoveBackward 200"); MoveBackward (200); while (DrvSensTach < 50) //wait until tach reaches 50 { } Serial.println ("MoveBackward 127"); MoveBackward (127); while (DrvSensTach < 60) //wait until tach reaches 60 { } Serial.println ("Brake"); Brake();
-edit- ben ik nou blind of heb je ze net weg geedit?
Als dat onder load gemeten is zou je arduino nog moeten werken.Raven schreef op maandag 21 januari 2013 @ 11:43:
[...]
7.18v aldus multimeter.... Heb al eens gemerkt dat deze blokjes (Ansmann) niet zo heel erg geweldig zijn, 9v Eneloops heb ik nog niet kunnen vinden.
Zonder load, Arduino gaat maar fractie van een sec aan als ik de batterij eraan hang. Heb de 2 9v blokjes die hier liggen eens in de batterijniveau meter gestopt, zo te zien zijn ze weer leeggelopen.mcDavid schreef op maandag 21 januari 2013 @ 12:03:
[...]
Als dat onder load gemeten is zou je arduino nog moeten werken.

After the first glass you see things as you wish they were. After the second you see things as they are not. Finally you see things as they really are, and that is the most horrible thing in the world...
Oscar Wilde
Ja, weg geedit, was er zelf ook al achter gekomen al was dat niet het probleem, zie vorige postmcDavid schreef op maandag 21 januari 2013 @ 12:03:
[...]
compileert dat met al die puntkomma's achter je whiles? haal ze iig eens weg.
-edit- ben ik nou blind of heb je ze net weg geedit?
Hij doet het nu in één keer wel. In de ISR voor de rotatie encoder had ik voor elke puls nog
1
| Serial.println (DrvSensTach); |
staan. Kan het zijn dat de serial overbelast wordt oid waardoor de hele Arduino niet meer goed werk?
Ik heb het zaakje nu in een procedure gezet, maar het heeft weer precies hetzelfde probleem: hij start op tot 255, maar blijft daarna op deze snelheid rijden zonder af te remmen terwijl de waarde van DrvSensTach wel gewoon blijft oplopen (tot voorbij alle waarden van de while-loops). Het lijkt of het programma blijft hangen na de Serial.println ("255"). Het maakt trouwens niet uit als ik deze regel weghaal.
Ik heb het idee dat ik iets chronisch fout doe, al zie ik niet wat. Iemand een idee?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
| void MoveBackwardPulses () { int Pulses = 70; TurningWheels = false; DrvSensTach = 0; for (int i=0; i<256; i++) { MoveBackward (i); delay (5); } Serial.println ("255"); Pulses2 = Pulses - 40; while (DrvSensTach < Pulses2) { } MoveBackward (200); Serial.println ("200"); Pulses2 = Pulses - 20; while (DrvSensTach < Pulses2) { } MoveBackward (127); Serial.println ("127"); Pulses2 = Pulses - 10; while (DrvSensTach < Pulses2) { } MoveBackward (75); Serial.println ("75"); while (DrvSensTach < Pulses) { } Brake(); } |
[ Voor 90% gewijzigd door almightyarjen op 21-01-2013 12:51 ]
Maar die seriele communicatie gebeurde vanuit de ISR? Daarin optimaliseert hij het niet, omdat hij daar nog wel begrijpt dat hij erbij hoort. Maar in je main code begrijpt hij niet dat de ISR buiten zijn programma om wordt aangeroepen, en dus optimaliseert hij het maar weg.
Al blijft het soms een beetje mysterieus wat de compiler doet (voor mij iig). Want de compiler weet wel dat die functie een ISR is, iig hij optimaliseert niet de complete ISR code weg (gelukkig). Waarom is hij dan niet slim genoeg om te beseffen dat alle variabelen die in een ISR worden gewijzigd niet weggeoptimaliseerd moeten worden?
Anyway komt eropneer gewoon altijd volatile declareren als het in een ISR wordt aangepast.
[code]
#include <avr/pgmspace.h>
const char PROGMEM blabla1=1;
const char blabla2 PROGMEM=1;
char blabla3 PROGMEM=1;
char PROGMEM blabla4=1;
prog_char blabla5 PROGMEM=1;
prog_char PROGMEM blabla6=1;
PROGMEM prog_char blabla7=1;
PROGMEM char blabla8=1;
[/code]
levert me allemaal dezelfde foutmelding op bij het compileren :
[code]
/sim.c:91: warning: '__progmem__' attribute ignored
/sim.c:92: warning: '__progmem__' attribute ignored
/sim.c:93: warning: '__progmem__' attribute ignored
/sim.c:94: warning: '__progmem__' attribute ignored
/sim.c:95: warning: '__progmem__' attribute ignored
/sim.c:96: warning: '__progmem__' attribute ignored
/sim.c:97: warning: '__progmem__' attribute ignored
/sim.c:98: warning: '__progmem__' attribute ignored
[/code]
Volgens mij heb ik elke variant wel zo'n beetje gehad die ik op internet ben tegengekomen, en toch wil het niet.. Volgens Arduino.cc zou het PROGMEM prog_char blabla=1; moeten zijn..
Dit is trouwens als ik de variabelen declareer in een functie, declareer ik een variabele globaal, dan krijg ik weer de volgende foutmelding..
[code]
/sim.c:21: warning: only initialized variables can be placed into program memory area
[/code]
Och ja, als ik in een functie dezelfde 10 varianten probeer, maar ze static maak, krijg ik ook de 'only initialized variables can be placed into program memory area' fout.. Terwijl ik ze toch echt initialiseer..
Heb de boel even op de serial gegooid en gek genoeg werkt het wel (ondanks de warnings).
In een functie declareer ik mijn array dus als :
1
| static PROGMEM prog_int16_t naam_van_array[aantal_ints] = {0,1,2,3,...}; |
en daarna kan ik het uitlezen met
1
| pgm_read_word_near(naam_van_array + i) |
Toch wil ik graag van die warnings af.. (alhoewel ze me onterecht lijken!!)
Woei! van 3130 bytes free naar 5354 bytes free gesprongen
[ Voor 30% gewijzigd door WVL_KsZeN op 21-01-2013 23:08 ]
/me heeft eindelijk ook een icoontje.. woef.. boeien..
Weet iemand een makkelijke//snelle//simpele manier om dat ding nou echt "recht" te laten rijden? Het is geen optie om de wielen te verbinden met een soort as aangezien de robot ook moet kunnen draaien.
3780wP (18x 210wP EC Solar) | 2x Marstek Venus E (5.12kWh)
Als hij bijvoorbeeld een lijn moet volgen is het geen probleem als hij een beetje scheef rijdt, dat past hij zelf wel aan. Als hij gewoon rechtdoor moet rijden zonder externe referenties zal je iets nodig hebben waarmee je precies kan bepalen hoeveel rondjes de motoren draaien. Bijvoorbeeld een optische encoder op je wielen, of stappenmotoren.
3780wP (18x 210wP EC Solar) | 2x Marstek Venus E (5.12kWh)
Als je de interne pullups wilt gebruiken zou het volgende moeten werken:
1
2
3
4
5
| pinMode(A4, INPUT); digitalWrite(A4, HIGH); pinMode(A5, INPUT); digitalWrite(A5, HIGH); Wire.begin(); |
De interne pullups zijn 20-50k, dat is wat aan de hoge kant; dus ik zou zelf als het even kan voor externe pullups van 10k of 4k7 kiezen.
[ Voor 17% gewijzigd door Springuin op 22-01-2013 14:45 ]
In parallel mode werkt ie wel (met PSB op High dus), maar dan verschijnen er her en der ook artifacts in beeld. Lijkt me dus dat er ergens in het LCD/board iets niet helemaal goed gaat. Binnenkort dx.com eens lastig gaan vallen
Xbox
Even the dark has a silver lining | I'm all you can imagine times infinity, times three
/me heeft eindelijk ook een icoontje.. woef.. boeien..
Arduino 1: voor aansturing aandrijf- en stuurmotoren van robot en LCD
Arduino 2: aansturing van de rest en uitlezing digitaal kompas
Arduino 2 leest het digitaal kompas uit en stuurt de waarde via I2C naar Arduino 1 die het op een LCD zet. Ik sta er versteld van hoe simpel het allemaal gaat

Gisteravond de random generator aan de praat gekregen en vanavond is het me gelukt het geheugengebruik zo ver terug te dringen dat de applicatie nu ook op mijn UNO draait
Volgende klusje was het netjes synchroniseren van het lopen van de rondjes (10x per seconde) met de seconde-overgangen van de RTC.
Het werkt als volgt :
in loop() zit alleen een if-statement, die kijkt of er een seconde-overgang is geweest. Zo niet, dan wordt er delay(10) uitgevoerd. Zo ja, dan wordt de if uitgevoerd en wordt mijn applicatie 10x aangeroepen. Iedere keer wordt uitgerekend hoe lang de functie-aanroep kostte, en de overige milliseconden wordt er gedelayed. (er wordt per seconde 9x gedelayed, de laatste delay vind dus plaats in loop met de delay(10)).
Overigens wel raar : hetzelfde programma op de Mega gebruikt meer geheugen. Ik heb het vermoeden dat dat ligt aan de hoeveelheid flash (32KB op UNO -> 2 bytes om te adresseren vs 256KB op de Mega2560 -> 3 bytes om te adresseren), maar zeker weten doe ik het niet.. De applicatie voor de UNO is ook meer dan een kilobyte kleiner, ondanks dat het exact dezelfde code is (uitgezonderd van het verschuiven van wat pinnen met een paar defines..)
In ieder geval doet mijn applicatie het, de shift-registers doen het, de RTC doet het, de applicatie loopt netjes 10x per seconde en de seriële communicatie doet het ook nog eens
/me heeft eindelijk ook een icoontje.. woef.. boeien..
De getallen die binnen komen is bv 15654730 ik geef dit nu zo door naar de LCD maar wil wat beter weergeven op de LCD.
bv. 15654730 moet 156.547.30 worden hoe kun je dit makelijk oplossen?
15654730 / 100000 = 156
15654730 % 100000 = 54730
54730 / 100 = 547
54730 % 100 = 30
All electric components run on smoke. If you let the smoke out, they won't work anymore.
zie :
unsigned long getFreqMode();
lcd.setCursor(0, 0);
lcd.print(rig.getFreqMode());
lcd.print("MHz ");
Dit is even grof:
unsigned long x,y,z;
z = rig.getFreqMode())
x = z / 10000;
z = z % 10000;
y = z / 100;
z = z % 100;
lcd.setCursor(0, 0);
lcd.print(x);
llcd.print('.');
cd.print(y);
lcd.print('.');
lcd.print(z);
lcd.print("MHz ");
All electric components run on smoke. If you let the smoke out, they won't work anymore.
Nu kan ik verder om het een en ander uit te proberen, heb onder tussen en motor shield binnen ik wil een 12 volt motor aansturen.
Als ik de een extrene voeding op de motor shield aansluit wordt de uno ook dan ook gelijk van spanning voorzien, en wordt de usb spanning van de pc gelijk geblokkeerd?

Zoja enig idee hoe je dat moet aansluiten?
MT Venus E 5KW (V151) P1 HomeWizard | Hackerspace Brixel te Hasselt (BE) - http://www.brixel.be | 9800X3D, 96GB DDR5 6000MHZ, NVIDIA GEFORCE 4090, ASRock X670E Steel Legend, Seasonic GX1000
En wat moge het zijn? Beetje klein plaatje enzo...Icekiller2k6 schreef op vrijdag 25 januari 2013 @ 17:30:
Vraagje heeft hier ooit iemand met dit gewerkt:
[afbeelding]
Zoja enig idee hoe je dat moet aansluiten?
http://www.ebay.com/itm/D...ageName=RSS:B:SHOP:US:101
weinig info over hoe je het moet aansluiten vind ik...
MT Venus E 5KW (V151) P1 HomeWizard | Hackerspace Brixel te Hasselt (BE) - http://www.brixel.be | 9800X3D, 96GB DDR5 6000MHZ, NVIDIA GEFORCE 4090, ASRock X670E Steel Legend, Seasonic GX1000
Dit is een beetje een slag in de lucht omdat ik er zelf niet aan toe ben gekomen - ben aan het inlezen voor draadloze modules en heb de onderdelen ook niet - maar terwijl ik vandaag het laatste hoofdstuk van dit boek doornam, kwam ook de boe-bot een beetje in beeld.Mattie112 schreef op dinsdag 22 januari 2013 @ 08:34:
Ik zit nu al een paar dagen te kloten om mijn robot (met 2 servo's) "rechtdoor" te laten rijden. Hoe ik ook kloot met speeds e.d. de ene keer heeft hij een afwijking naar rechts en de andere keer naar links echt ongelooflijk.
Weet iemand een makkelijke//snelle//simpele manier om dat ding nou echt "recht" te laten rijden? Het is geen optie om de wielen te verbinden met een soort as aangezien de robot ook moet kunnen draaien.
Hoewel ik dat nu niet gaat opzoeken, heb genoeg gelezen voor vandaag, wordt er met die bot dat gebruik maakt van servo's als aandrijving een compass en/of een accelerometer op aangesloten. Ik vermoed dat je met die twee sensoren een rechte(re) lijn kunt rijden maar ik garandeer het niet.
In dit gratis boek valt meer te lezen over die 2 instrumentjes en kun je eventueel zelf bepalen, of van anderen die er wel praktijk mee hebben, of je er wat aan hebt.
ps, dat laatste boek heb ik slechts gelezen tot aan het hoofdstuk Ping, vandaar een 'slag in de lucht'
[ Voor 3% gewijzigd door kitao op 26-01-2013 16:15 . Reden: ps ]
Ik heb weer een probleem
Ik heb aan mijn UNO een i2c/serial LCD-keypad controller hangen
(http://web4robot.com/LCDCtrl.html)
Het werkt op zich goed kan de LCD en Keypad via i2c aansturen en uitlezen.
Bij het uitlezen van Keypad krijg ik een waarde van 1 tot 16 afhankelijk welke key ik indruk.
Ik wil nu een 9 cijferige code intypen en deze vervolgens ergens anders weergebruiken (in het programma)
Het indrukken van de code en weergeven op de LCD dat lukt .
Maar de hoe ik krijg ik een code die ik als een variabele kan gebruiken?
En hoe krijg ik automatisch een punt tussen de drie cijfers op de LCD?
(123.456.789) ipv (123456789)
De oplossing zal wel eenvoudig maar voor een beginner is dit moeilijk .
(met het key # (waarde 15) kom ik uit de While lus)
Het volgende stukje heb ik :
void input()
{
lcd.begin();
lcd.setCursor(0,0);
lcd.print("geef de code");
lcd.setCursor(0,1);
lcd.blink();
int dataByte = lcd.keypad();
while (dataByte != 15 ){
dataByte = lcd.keypad();
if (dataByte == 1 ) { lcd.print("1"); }
if (dataByte == 2 ) { lcd.print("2"); }
if (dataByte == 3 ) { lcd.print("3"); }
if (dataByte == 5 ) { lcd.print("4"); }
if (dataByte == 6 ) { lcd.print("5"); }
if (dataByte == 7 ) { lcd.print("6"); }
if (dataByte == 9 ) { lcd.print("7"); }
if (dataByte == 10 ) { lcd.print("8"); }
if (dataByte == 11 ) { lcd.print("9"); }
if (dataByte == 14 ) { lcd.print("0"); }
}
lcd.noBlink();
lcd.begin();
}
Verwijderd
Ik heb een (zelfbouw)kastje met daarop een ATtiny45. De ATtiny doet niks anders dan
de USB-code omzetten naar I2C. Maar de ATtiny heeft een Vendor-id. Dus kan dat
zelbouwkastje alleen gebruiken met de bijbehorende vrij verkrijgbare software.
Nu wil ik de ATtiny vervangen door de ATmega 2560. De 16u2 doet precies hetzelfde
als de ATtiny. Alleen het formaat is dan serieel. Dat seriele wil ik dan doorsturen
met een sketch naar I2C. Maar om de ATmega 2560 'zichtbaar' te maken voor de
software (die eigenlijk alleen die ATtiny wil zien) zal ik de Vendor-id moeten veranderen.
Wie weet in welk stukje software de Vendor-id staat die ik dan kan veranderen?
Om daarna als 'nieuwe' bootloader via ICSP kan uploaden naar de 16u2.
Wil je het als een string of een int opslaan? Want als string is volgens mij nogal makkelijk. In plaats van dat je het print stop je het telkens achterin in je string erbij. Daarna kun je die string in één keer printen of misschien kun je dan eerst die punten ook nog wel er tussen knutselen. Ik ben alleen totaal niet thuis in arduino dus vraag me niet om de juiste syntax.jwsmid schreef op dinsdag 29 januari 2013 @ 00:58:
verhaal...
Maar de hoe ik krijg ik een code die ik als een variabele kan gebruiken?
En hoe krijg ik automatisch een punt tussen de drie cijfers op de LCD?
(123.456.789) ipv (123456789)
De oplossing zal wel eenvoudig maar voor een beginner is dit moeilijk .
(met het key # (waarde 15) kom ik uit de While lus)
Het volgende stukje heb ik :
void input()
{
lcd.begin();
lcd.setCursor(0,0);
lcd.print("geef de code");
lcd.setCursor(0,1);
lcd.blink();
int dataByte = lcd.keypad();
while (dataByte != 15 ){
dataByte = lcd.keypad();
if (dataByte == 1 ) { lcd.print("1"); }
if (dataByte == 2 ) { lcd.print("2"); }
if (dataByte == 3 ) { lcd.print("3"); }
if (dataByte == 5 ) { lcd.print("4"); }
if (dataByte == 6 ) { lcd.print("5"); }
if (dataByte == 7 ) { lcd.print("6"); }
if (dataByte == 9 ) { lcd.print("7"); }
if (dataByte == 10 ) { lcd.print("8"); }
if (dataByte == 11 ) { lcd.print("9"); }
if (dataByte == 14 ) { lcd.print("0"); }
}
lcd.noBlink();
lcd.begin();
}
Edit: Even gezocht, ik denk dat je hier wel wat mee kunt:
http://arduino.cc/en/Reference/StringConcat
en voor de punt:
http://arduino.cc/en/Reference/StringSetCharAt
[ Voor 5% gewijzigd door Dutch Lion op 31-01-2013 08:09 ]
"it's better to live one day as a lion, than a hundred years as a lamb."
Verwijderd
Iemand ideen waar het aan kan liggen? Zou het kunnen dat doordat het ontvangen erbij zit de delays van het versturen niet meer kloppen?
Mart
ps ik ben arduino leek
pps. als het werkt wil ik het gaan printen en verspreiden^^
ppps.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
| #include <ps2dev.h> PS2dev keyboard(3, 2); // PS2dev object (2:clock 3:clock) unsigned char enabled = 0; const byte DataInPin = 8; const byte IRQInPin = 5; const byte pows[] = {1, 2, 4, 8, 16, 32, 64, 128, 256}; const byte DVORAK[] = {82, 65, 49, 77, 53, 43, 52, 33, 45, 75, 74, 85, 68, 36, 60, 67, 35, 51, 44, 49, 27, 78, 76, 21, 59, 66, 34, 50, 29, 42, 26, 84, 91}; const byte QWERTY[] = {21, 29, 36, 45, 44, 53, 60, 67, 68, 77, 84, 91, 27, 35, 43, 52, 51, 59, 66, 75, 76, 82, 26, 34, 33, 42, 50, 49, 65, 73, 74, 78, 85}; byte iter = 0; byte value = 0; byte bytes = 0; void ack() { while(keyboard.write(0xFA)); } int keyboardcommand(int command) { unsigned char val; switch (command) { case 0xFF: ack(); while(keyboard.write(0xAA)!=0); break; case 0xFE: ack(); break; case 0xF6: ack(); break; case 0xF5: enabled = 0; ack(); break; case 0xF4: enabled = 1; ack(); break; case 0xF3: ack(); keyboard.read(&val); ack(); break; case 0xF2: ack(); keyboard.write(0xAB); keyboard.write(0x83); break; case 0xF0: ack(); keyboard.read(&val); ack(); break; case 0xEE: keyboard.write(0xEE); break; case 0xED: ack(); keyboard.read(&val); ack(); break; } } void setup() { Serial.begin(9600); Serial.println("Start..."); pinMode(IRQInPin, INPUT); pinMode(DataInPin, INPUT); while(keyboard.write(0xAA)!=0) delay(250); Serial.println("Output connection made"); delay(10); } void loop() { /*unsigned char c; if((digitalRead(3)==LOW) || (digitalRead(2) == LOW)) { while(keyboard.read(&c)); keyboardcommand(c); reset(); } else { int tval = digitalRead(IRQInPin); if(tval==0 && value!=0) { if(iter>0 && iter<9 && digitalRead(DataInPin)==HIGH) { bytes += pows[iter-1]; } iter++; if(iter==11) process(bytes); } value = tval; delayMicroseconds(5); } } void reset() { iter = 0; value = 0; bytes = 0; } void process(byte b) { for(int i = 0; i<33; i++) { if(b == QWERTY[i]) { b = DVORAK[i]; break; } } keyboard.write(b); //Serial.println(b); iter = 0; value = 0; bytes = 0; } |
[ Voor 72% gewijzigd door Verwijderd op 31-01-2013 09:47 ]
3780wP (18x 210wP EC Solar) | 2x Marstek Venus E (5.12kWh)
Delay's zijn altijd klote en moet je eigenlijk vermijden. Zie zo 123 niet iets fout aan je code. Wat doet het als je de delay weghaalt?
Zelf zit ik atm ook ff te kloten.
Stel:
Ik heb een LED en 4 buttons.
De led wil ik laten knipperen zoals dit:
led aan
delay(pulsetime)
led uit
delay(delaytime)
maw: ik wil de AAN én de UIT tijd van de LED kunnen besturen met de buttons.
Nou zit ik daar dik mee te kloten. Via delays werkt het wel maar dan werken mn knoppen niet meer dus heb ik gebruik gemaakt van een library als "timer". Maar hoe ga ik dit nu regelen
Ik wil bijvoorbeeld de LED 1000ms aan hebben en dan 50 uit maar wat ik ook doe, hij blijft gewoon even lang aan als uit.
Dit is mijn code nu:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
| #include "test.h" const int buttonDelayIncPin = 2; // the number of the pushbutton pin const int buttonDelayDecPin = 3; const int buttonPulseIncPin = 4; const int buttonPulseDecPin = 5; const int ledPin = 13; // the number of the LED pin //const int relayPin = 8; int state = LOW; bool pulsebool = false; bool delaybool = true; SimpleTimer timer; int pulsinterval = 10; int pulscounter = 0; int delayinterval = 10; int delaycounter = 0; AdvButton buttonDelayInc(buttonDelayIncPin, DelayInc, 100, 10000, btn_Digital); AdvButton buttonDelayDec(buttonDelayDecPin, DelayDec, 100, 10000, btn_Digital); AdvButton buttonPulseInc(buttonPulseIncPin, PulseInc, 100, 10000, btn_Digital); AdvButton buttonPulseDec(buttonPulseDecPin, PulseDec, 100, 10000, btn_Digital); int pulsetime = 1000; int delaytime = 50; void setup() { Serial.begin(9600); Serial.println("start"); pinMode(ledPin, OUTPUT); // pinMode(relayPin, OUTPUT); timer.setInterval(pulsinterval, pulse); pulscounter = pulsetime; timer.setInterval(delayinterval, delayvoid); delaycounter = delaytime; timer.setInterval(1000, printding); } void printding() { Serial.print("Delay: "); Serial.println(delaytime); Serial.print("Pulse: "); Serial.println(pulsetime); Serial.print("delaybool: "); Serial.println(delaybool); } void pulse() { if (pulsebool) { pulscounter = pulscounter - pulsinterval; if (pulscounter <= 0) { Serial.println("pulsecounter is 0"); //doe iets if (state == LOW) { state = HIGH; } else { state = LOW; } digitalWrite(ledPin, state); pulscounter = pulsetime; delaybool = true; pulsebool = false; } } } void delayvoid() { if (delaybool) { delaycounter = delaycounter - delayinterval; if (delaycounter <= 0) { if (!pulsebool) { pulsebool = true; delaybool = false; } else { pulsebool = true; } delaycounter = delaytime; } } } void DelayInc(AdvButton* but) { delaytime += 50; } void DelayDec(AdvButton* but) { delaytime -= 50; if (delaytime < 0) delaytime = 0; } void PulseInc(AdvButton* but) { pulsetime += 50; } void PulseDec(AdvButton* but) { pulsetime -= 50; } void loop() { ButtonManager::instance()->checkButtons(); timer.run(); // Serial.print("Delay: "); // Serial.println(delaytime); // Serial.print("Pulse: "); // Serial.println(pulsetime); } |
Paar opmerkingen:
- de buttons is een library, dat werkt verder prima
- de timer maak ik meerdere malen aan, 1 voor pulsetime en 1 voor delaytime (en 1 voor debug output)
Als iemand een beter idee heeft dan houd ik me ook aanbevolen!
3780wP (18x 210wP EC Solar) | 2x Marstek Venus E (5.12kWh)
Maar snap wel dat het met delay niet werkt want dat is gewoon busy waiting. Ik weet niet of Arduino ook RTOS functies heeft die dus een niet busy wait kunnen doen. Dat zou dan een optie zijn.
Je zou ook met interrupts voor je buttons kunnen werken.
"it's better to live one day as a lion, than a hundred years as a lamb."
Ik zou de meduino nano willen gebruiken om enkele analoge inputs (in mijn gevat CT sensor zoals in dit project) en enkele digitale inputs (220V detecteren via ledschakeling en een interface naar Nikobus)
Wat ik me echter afvraag is of de meduino nano krachtig genoeg is om alles samen te doen? Of neem ik beter een aparte meduino nano voor de Nikobus interface en eentje voor andere inputs?
Concreet werkt de nikobus als volgt: continu luisteren op de bus als er iets langskomt en op vraag ook iets verzenden en het eventuele antwoord dan verzenden.
Het lijkt me dus correct om te zetten dat de frequentie meestal heel laag is, alleen vroeg ik me af wat de belasting van de rest was :3x ct sensor uitlezen om de seconde / spanningsmeting doen op een andere analoge pin / kijken naar 3 digitale inputs van de 220V led en nog eens die CT/spanning herrekenen.
Deze zijn immers niet kritiek (een seconde later heb je een nieuw resultaat), maar de Nikobus die stuurt het signaal niet opnieuw, dus die wil ik niet missen.
Zonder echt te snappen wat je ermee wilt: In de Setup() zet je 3x timer.setInterval achter elkaar. Hierdoor verander je telkens de serviceroutine die de timer moet aanroepen bij een overflow. In dit geval zal hij dus alleen de laatste (printding) gaan koppelen aan een overflow (elke 1000ms)...Mattie112 schreef op donderdag 31 januari 2013 @ 19:26:
@dopefish
Delay's zijn altijd klote en moet je eigenlijk vermijden. Zie zo 123 niet iets fout aan je code. Wat doet het als je de delay weghaalt?
Zelf zit ik atm ook ff te kloten.
Stel:
Ik heb een LED en 4 buttons.
De led wil ik laten knipperen zoals dit:
led aan
delay(pulsetime)
led uit
delay(delaytime)
maw: ik wil de AAN én de UIT tijd van de LED kunnen besturen met de buttons.
Nou zit ik daar dik mee te kloten. Via delays werkt het wel maar dan werken mn knoppen niet meer dus heb ik gebruik gemaakt van een library als "timer". Maar hoe ga ik dit nu regelen
Ik wil bijvoorbeeld de LED 1000ms aan hebben en dan 50 uit maar wat ik ook doe, hij blijft gewoon even lang aan als uit.
Dit is mijn code nu:
C++:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 #include "test.h" const int buttonDelayIncPin = 2; // the number of the pushbutton pin const int buttonDelayDecPin = 3; const int buttonPulseIncPin = 4; const int buttonPulseDecPin = 5; const int ledPin = 13; // the number of the LED pin //const int relayPin = 8; int state = LOW; bool pulsebool = false; bool delaybool = true; SimpleTimer timer; int pulsinterval = 10; int pulscounter = 0; int delayinterval = 10; int delaycounter = 0; AdvButton buttonDelayInc(buttonDelayIncPin, DelayInc, 100, 10000, btn_Digital); AdvButton buttonDelayDec(buttonDelayDecPin, DelayDec, 100, 10000, btn_Digital); AdvButton buttonPulseInc(buttonPulseIncPin, PulseInc, 100, 10000, btn_Digital); AdvButton buttonPulseDec(buttonPulseDecPin, PulseDec, 100, 10000, btn_Digital); int pulsetime = 1000; int delaytime = 50; void setup() { Serial.begin(9600); Serial.println("start"); pinMode(ledPin, OUTPUT); // pinMode(relayPin, OUTPUT); timer.setInterval(pulsinterval, pulse); pulscounter = pulsetime; timer.setInterval(delayinterval, delayvoid); delaycounter = delaytime; timer.setInterval(1000, printding); } void printding() { Serial.print("Delay: "); Serial.println(delaytime); Serial.print("Pulse: "); Serial.println(pulsetime); Serial.print("delaybool: "); Serial.println(delaybool); } void pulse() { if (pulsebool) { pulscounter = pulscounter - pulsinterval; if (pulscounter <= 0) { Serial.println("pulsecounter is 0"); //doe iets if (state == LOW) { state = HIGH; } else { state = LOW; } digitalWrite(ledPin, state); pulscounter = pulsetime; delaybool = true; pulsebool = false; } } } void delayvoid() { if (delaybool) { delaycounter = delaycounter - delayinterval; if (delaycounter <= 0) { if (!pulsebool) { pulsebool = true; delaybool = false; } else { pulsebool = true; } delaycounter = delaytime; } } } void DelayInc(AdvButton* but) { delaytime += 50; } void DelayDec(AdvButton* but) { delaytime -= 50; if (delaytime < 0) delaytime = 0; } void PulseInc(AdvButton* but) { pulsetime += 50; } void PulseDec(AdvButton* but) { pulsetime -= 50; } void loop() { ButtonManager::instance()->checkButtons(); timer.run(); // Serial.print("Delay: "); // Serial.println(delaytime); // Serial.print("Pulse: "); // Serial.println(pulsetime); }
Paar opmerkingen:
- de buttons is een library, dat werkt verder prima
- de timer maak ik meerdere malen aan, 1 voor pulsetime en 1 voor delaytime (en 1 voor debug output)
Als iemand een beter idee heeft dan houd ik me ook aanbevolen!
Ik heb 3 bytes welke de uren, minuten en seconden bevatten.
ik moet die bytes splitsen; als het aantal uren bijvoorbeeld "15" is, dan wil ik daar twee bytes van maken, met de waarden "1" en "5" om het display per segment aan te kunnen sturen. Dit geldt uiteraard ook voor de minuten en de seconden.
Is er een makkelijk foefje om dit te realiseren?
en minutes%10
[ Voor 30% gewijzigd door mcDavid op 07-02-2013 23:47 ]
Overigens is floor() niet nodig bij int's of char's, er wordt bij delen altijd naar beneden afgerond als het resultaat geen getallen achter de komma kan bevatten. Floor() kun je dus ook gewoon weglaten in dit geval.
dus :
(int)5/(int)10 = 0
[ Voor 4% gewijzigd door WVL_KsZeN op 08-02-2013 14:08 ]
/me heeft eindelijk ook een icoontje.. woef.. boeien..
Het grootste gedeelte van de standaard C functies werkt gewoon.almightyarjen schreef op vrijdag 08 februari 2013 @ 12:15:
Thanks. Is die floor() geen officiële routine ofzo? De compiler pakt hem wel, maar ik zie er maar weinig uitleg over (iig niet op de officiële site)..
toch vind ik het wel prettig in dit geval, met floor() is ten minste gelijk duidelijk wat die regel doet.WVL_KsZeN schreef op vrijdag 08 februari 2013 @ 14:00:
Overigens is floor() niet nodig bij int's of char's, er wordt bij delen altijd naar beneden afgerond als het resultaat geen getallen achter de komma kan bevatten. Floor() kun je dus ook gewoon weglaten in dit geval.
dus :
(int)5/(int)10 = 0
Eensch. Ondanks dat het niets toevoegt maakt het het lezen van de code eenvoudiger.mcDavid schreef op vrijdag 08 februari 2013 @ 15:06:
toch vind ik het wel prettig in dit geval, met floor() is ten minste gelijk duidelijk wat die regel doet.
ik ben bezig met een looplichtje aan het maken van 16 leds. Het programma geeft een fout aan(zie in het oranje). Wat doe ik fout?

Alvast bedankt voor de moeite!!
Groeten,
Tom
/me heeft eindelijk ook een icoontje.. woef.. boeien..
Als ik een , ipv ; komt de foutmelding 'at this point in file'WVL_KsZeN schreef op zaterdag 09 februari 2013 @ 16:57:
Je gebruikt een ; ipv een ,
Sorry als ik domme vragen stel, ik snap niet veel van engels.
Dat is toch voor 1 shiftregister?Harrie schreef op zaterdag 09 februari 2013 @ 17:07:
Ik vermoed dat je dus shiftOut(datapin, clockpin, MSBFIRST,B0010000); moet doen.
of begrijp ik je nu fout?
Ik ben niet zo bekend met arduinos, maar als je bijvoorbeeld hier kijkt, accepteert de ShiftOut functie maximaal 4 argumenten. http://arduino.cc/en/Reference/shiftOuttommie14 schreef op zaterdag 09 februari 2013 @ 17:09:
[...]
Dat is toch voor 1 shiftregister?
of begrijp ik je nu fout?
Ik denk dat als je 16 bits naar buiten wilt schuiven, je gewoon eerst de eerste 8, en daarna de 2e 8 wilt doen?
Dus zoiets:
shiftOut(datapin, clockpin, MSBFIRST,B0010000);
shiftOut(datapin, clockpin, MSBFIRST,B0000000);
Je shift registers zijn normaal gekoppeld, zodat de eerste 8 door het eerste register schuiven en in de 2e terecht komen. Zie hier: http://www.arduino.cc/en/Tutorial/ShiftOut
Het blauwe lijntje tussen de 2 registers op dit schema zorgt daarvoor: http://arduino.cc/en/uploads/Tutorial/ShftOut_Schm2.gif
Of misschien werkt dit ook wel:
shiftOut(datapin, clockpin, MSBFIRST,B001000000000000);
waarmee je dan dus alle 16 tegelijk naar buiten schuift. Maar ik heb geen idee of ShiftOut dit accepteert.
[ Voor 47% gewijzigd door Harrie op 10-02-2013 00:21 ]
Als je dat doet gaat er toch eerst het 3e ledje branden en daarna geen een. of ben ik nou zo gek.Harrie schreef op zaterdag 09 februari 2013 @ 17:12:
[...]
Dus zoiets:
shiftOut(datapin, clockpin, MSBFIRST,B0010000);
shiftOut(datapin, clockpin, MSBFIRST,B0000000);
[/s]
Op deze manier gaat het 3e ledje van de 16 branden.tommie14 schreef op zaterdag 09 februari 2013 @ 18:35:
[...]
Als je dat doet gaat er toch eerst het 3e ledje branden en daarna geen een. of ben ik nou zo gek.
Wil je het 3e ledje van de eerste 8 leds, en bijvoorbeeld het 5e ledje van de 2e 8 leds, doe je dus:
digitalWrite(latchPin, LOW);
shiftOut(datapin, clockpin, MSBFIRST,B0010000); //eerste 8 leds
shiftOut(datapin, clockpin, MSBFIRST,B0000100); //2e 8 leds
digitalWrite(latchPin, HIGH);
Leds gaan pas aan of uit als je de latchpin hoog maakt.
[ Voor 5% gewijzigd door Harrie op 09-02-2013 18:57 ]
(rood is 1t/m8, groen is 8t/m16)
Is er wat fout?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
| int clockpin = 2; int datapin = 3; int latchpin = 4; void setup(){ pinMode(clockpin,OUTPUT); pinMode(datapin,OUTPUT); pinMode(latchpin,OUTPUT); } void loop(){ digitalWrite(latchpin,LOW); shiftOut(datapin, clockpin, MSBFIRST, B00000001); digitalWrite(latchpin, HIGH); delay(1000); digitalWrite(latchpin,LOW); shiftOut(datapin, clockpin, MSBFIRST, B00000010); digitalWrite(latchpin, HIGH); delay(1000); digitalWrite(latchpin,LOW); shiftOut(datapin, clockpin, MSBFIRST, B00000100); digitalWrite(latchpin, HIGH); delay(1000); digitalWrite(latchpin,LOW); shiftOut(datapin, clockpin, MSBFIRST, B00001000); digitalWrite(latchpin, HIGH); delay(1000); digitalWrite(latchpin,LOW); shiftOut(datapin, clockpin, MSBFIRST, B00010000); digitalWrite(latchpin, HIGH); delay(1000); digitalWrite(latchpin,LOW); shiftOut(datapin, clockpin, MSBFIRST, B00100000); digitalWrite(latchpin, HIGH); delay(1000); digitalWrite(latchpin,LOW); shiftOut(datapin, clockpin, MSBFIRST, B01000000); digitalWrite(latchpin, HIGH); delay(1000); digitalWrite(latchpin,LOW); shiftOut(datapin, clockpin, MSBFIRST, B10000000); digitalWrite(latchpin, HIGH); delay(1000); digitalWrite(latchpin,LOW); shiftOut(datapin, clockpin, MSBFIRST, B00000000); shiftOut(datapin, clockpin, MSBFIRST, B00000001); digitalWrite(latchpin, HIGH); delay(1000); digitalWrite(latchpin,LOW); shiftOut(datapin, clockpin, MSBFIRST, B00000000); shiftOut(datapin, clockpin, MSBFIRST, B00000010); digitalWrite(latchpin, HIGH); delay(1000); digitalWrite(latchpin,LOW); shiftOut(datapin, clockpin, MSBFIRST, B00000000); shiftOut(datapin, clockpin, MSBFIRST, B00000100); digitalWrite(latchpin, HIGH); delay(1000); digitalWrite(latchpin,LOW); shiftOut(datapin, clockpin, MSBFIRST, B00000000); shiftOut(datapin, clockpin, MSBFIRST, B00001000); digitalWrite(latchpin, HIGH); delay(1000); digitalWrite(latchpin,LOW); shiftOut(datapin, clockpin, MSBFIRST, B00000000); shiftOut(datapin, clockpin, MSBFIRST, B00010000); digitalWrite(latchpin, HIGH); delay(1000); digitalWrite(latchpin,LOW); shiftOut(datapin, clockpin, MSBFIRST, B00000000); shiftOut(datapin, clockpin, MSBFIRST, B00100000); digitalWrite(latchpin, HIGH); delay(1000); digitalWrite(latchpin,LOW); shiftOut(datapin, clockpin, MSBFIRST, B00000000); shiftOut(datapin, clockpin, MSBFIRST, B01000000); digitalWrite(latchpin, HIGH); delay(1000); digitalWrite(latchpin,LOW); shiftOut(datapin, clockpin, MSBFIRST, B00000000); shiftOut(datapin, clockpin, MSBFIRST, B10000000); digitalWrite(latchpin, HIGH); delay(1000); } |
Ook denk ik dat je volgorde aan het eind niet helemaal klopt. De bit die je als eerste weg schrijft, komt uiteindelijk terecht bij de de laatste groene led in de rij (die het verst weg zit van de roden). (Ik ga er dan wel even vanuit dat je het hetzelfde als in het voorbeeld hebt aangesloten).
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
| digitalWrite(latchpin,LOW); shiftOut(datapin, clockpin, MSBFIRST, B10000000); //groen shiftOut(datapin, clockpin, MSBFIRST, B00000000); //rood digitalWrite(latchpin, HIGH); delay(1000); digitalWrite(latchpin,LOW); shiftOut(datapin, clockpin, MSBFIRST, B01000000); shiftOut(datapin, clockpin, MSBFIRST, B00000000); digitalWrite(latchpin, HIGH); delay(1000); digitalWrite(latchpin,LOW); shiftOut(datapin, clockpin, MSBFIRST, B00100000); shiftOut(datapin, clockpin, MSBFIRST, B00000000); digitalWrite(latchpin, HIGH); delay(1000); digitalWrite(latchpin,LOW); shiftOut(datapin, clockpin, MSBFIRST, B00010000); shiftOut(datapin, clockpin, MSBFIRST, B00000000); digitalWrite(latchpin, HIGH); delay(1000); //ik laat er hier even een paar weg digitalWrite(latchpin,LOW); shiftOut(datapin, clockpin, MSBFIRST, B00000001); shiftOut(datapin, clockpin, MSBFIRST, B00000000); digitalWrite(latchpin, HIGH); delay(1000); digitalWrite(latchpin,LOW); shiftOut(datapin, clockpin, MSBFIRST, B00000000); shiftOut(datapin, clockpin, MSBFIRST, B10000000); digitalWrite(latchpin, HIGH); delay(1000); digitalWrite(latchpin,LOW); shiftOut(datapin, clockpin, MSBFIRST, B00000000); shiftOut(datapin, clockpin, MSBFIRST, B01000000); digitalWrite(latchpin, HIGH); delay(1000); digitalWrite(latchpin,LOW); shiftOut(datapin, clockpin, MSBFIRST, B00000000); shiftOut(datapin, clockpin, MSBFIRST, B00100000); digitalWrite(latchpin, HIGH); delay(1000); //en zo verder tot de laatste: digitalWrite(latchpin,LOW); shiftOut(datapin, clockpin, MSBFIRST, B00000000); shiftOut(datapin, clockpin, MSBFIRST, B00000001); digitalWrite(latchpin, HIGH); delay(1000); |
Zijn je schuif registers aangesloten zoals in het schema in het voorbeeld? In het schema is iets geks, en staan pinnen in een andere volgorde (verkeerde) weergeven... Dus dat schema wat ik eerder noemde moet je voorzichtig mee zijn. Dat zou kunnen verklaren dat je raar gedrag krijgt.
Echter deze afbeelding is volgens mij correct:

Vergelijk ook met de datasheet:
http://www.sparkfun.com/datasheets/IC/SN74HC595.pdf
[ Voor 14% gewijzigd door Harrie op 10-02-2013 00:20 ]
dit gebeurt er nu.
View My Video
hoe komt dit?
Ik heb verschillende shiftregisters geprobeerd.
de ledjes raken elkaar ook niet.
Zet eens een condensatortje (100nF) tussen GND en RCK?
[ Voor 37% gewijzigd door WVL_KsZeN op 10-02-2013 18:04 ]
/me heeft eindelijk ook een icoontje.. woef.. boeien..
Is dat de latchpin? Daar heb ik namelijk al een condensator overheen staan van 1 uf.
[ Voor 46% gewijzigd door tommie14 op 11-02-2013 09:36 ]
/me heeft eindelijk ook een icoontje.. woef.. boeien..
Ik wil me namelijk iets breder gaan orienteren als alleen arduino (uno heb ik nu liggen). En vroeg me af het bevalt om dit te doen via de arduino?
Ik heb Atmega's geprogrammeerd in Assembly, via een STK500 op AVR studio met WINAVR. Heb er niet bijster veel ervaring mee moet ik eerlijk toegeven (veel meer C gebruikt). Ik heb alleen geen idee in hoeverre je Arduino hier nog voor kan gebruiken.Rusky schreef op maandag 11 februari 2013 @ 14:46:
is hier misschien ook iemand die de arduino gebruikt om assembler te programeren? via de atmel avr studio of iets dergelijks?
Ik wil me namelijk iets breder gaan orienteren als alleen arduino (uno heb ik nu liggen). En vroeg me af het bevalt om dit te doen via de arduino?
Assembly programmeren doe je normaal gesproken alleen als je snelheid te kort komt, ik denk dat het dan sowieso niet aan te raden is om Arduino te gaan gebruiken
gewoon nee.
Je kan wel een keertje assembly programma maken die LED laat knipperen bijvoorbeeld, moet je wel rekening mee houden als je dat vanuit avr studio doet je de arduino bootloader zal overschrijven. En assembly kan best een stukje efficienter zijn, gezien dat iig de avr-gcc compiler nogal voorzichtig volgens mij is met gebruik van registers. Terwijl atmels zoveel registers hebben dat je niet snel het SRAM hoeft te gebruiken.
Ik heb een Meduino Nano bordje (dus eigenlijk hetzelfde als de arduino nano)
In bascom heb ik het werkend, en had ik een detectie van een "rising" interupt nodig.
Klopt het dat bij de nano er maar 2 pinnen zijn die dit kunnen? namelijk pin digital 2 en 3? (die interupt 0 en 1 respectievelijk geven).
Ik had immers jammer genoeg m'n bordje zo gemaakt dat ik ging inlezen op pin digital 10
Maar alle pinnen kunnen als interrupt worden gebruikt, voornaamste beperking is dat het pin-change interrupts zijn: het maakt hem niet uit of hij van hoog naar laag gaat of andersom, hij triggered altijd. Maar voor de meeste applicaties is daar wel mee te werken: of je zorgt dat interrupt uit staat als falling edge komt, of je begint interrupt met een check of de pin nu hoog of laag is, dan weet je welke edge je hebt gehad.
@almightyarjen: meer info staat op deze pagina (link) meestal is pin2 int0 en pin 3 int1 - je kan ook het pinnummer opgeven soms
Voor m'n domotica zou ik een crc16 moeten kunnen berekenen, maar via google kwam ik niet echt veel wijzer.
In bascom doe ik: (let niet teveel in de slordige code, ik ben echte een leek in bascom)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
| Teller007b = 1 Teller008b = 23 Do Tempstrb = Mid(nb_string5 , Teller008b , 2) Crc(teller007b) = Hexval(tempstrb) Incr Teller007b Decr Teller008b Decr Teller008b Loop Until Teller007b > 10 Aant_crcb = 10 Res_crcb = Hex(crc16uni(crc(1) , Aant_crcb , &HFFFF , &H1021 , 0 , 0)) Nb_string = Mid(res_crcb , 3 , 2) + Mid(res_crcb , 1 , 2) + Mid(nb_string5 , 5 , 20) |
maar hoe vertaal ik dit nu in iets dat hetzelfde doet voor een arduino?
1
| byte commandbits = B11000000; //command bits - start, mode, chn (3), dont care (3) |
In de datasheet van mijn mcp3304 staat praktisch hetzelfde, alleen om differential te kunnen meten, en dus ook daadwerkelijk 13-bit resolutie te krijgen, heb ik van de tweede 1 een 0 gemaakt. Dit zou hem in differential mode moeten zetten.
1
2
| //read bits from adc for (int i=11; i>=0; i--){ |
Van die 11 heb ik een 12 gemaakt. Mijn eerste gedachte zou zijn om hier een 13 van te maken maar dan gaf hij getallen groter dan 2^13 terug.
Nu is alles mooi aangesloten, maar hij blijft onzingetallen geven.... Kan iemand mij vertellen wat ik verder nog moet doen om dit werkend te krijgen?
[ Voor 11% gewijzigd door boazkl0p op 14-02-2013 10:35 ]
Werkt het wel in de standaard mode?
Weet je zeker dat hij differential 13 bits uitgeeft? Ik kan daar niets van vinden in de datasheet.
[ Voor 134% gewijzigd door Harrie op 14-02-2013 20:08 ]
Als alle command bits 0 zijn, dan is channel 0 IN+. Sluit je het signaal qua polariteit wel goed aan? En wat Harrie zegt: kijk eerst even of je hem aan de praat krijgt in standard mode...

Zo'n dingetje dus, met oplaadbare li-ion batterij.
Het is me 100% duidelijk hoe de klok werkt, maar ik vroeg me af of ik nog iets speciaals moest doen om de batterij te laden opladen. Er is eigenlijk nergens een handleiding te vinden en ik vraag me af of ik de BAT pin moet aansluiten of niet.. Is de BAT pin bedoeld om de batterij op te laden, of kun je er juist ander klein spul mee voeden? Er is nergens een specificatie te vinden..
Ik heb nu alleen GND,VCC,SDA en SCL aangesloten.. moet ik de BAT pin ook op 5V aansluiten?
Als het bordje geen spanning heeft, dan staat er overigens 2,884V tussen BAT en GND. Als ik spanning op het bordje zet (5V tussen GND en VCC), dan stijgt de spanning naar 3,062V. Of dit nu komt doordat de batterij geladen wordt, of doordat de batterij geen stroom meer hoeft te leveren naar de DS1307 (geen stroom geleverd door de batterij => hogere spanning) is me helaas niet duidelijk....
[ Voor 29% gewijzigd door WVL_KsZeN op 17-02-2013 22:36 ]
/me heeft eindelijk ook een icoontje.. woef.. boeien..
Ik heb trouwens twee van deze jongens:

https://www.sparkfun.com/products/11441
het werkt allemaal perfect, van één van de displays heb ik het I2C adres gewijzigd, werkte ook perfect. De spanning is er een paar keer af gegaan en het werkte nog steeds. En zo in eens was het gewijzigde display zijn I2C "vergeten" en stond die weer op de factory setting. Dit is me nu al een paar keer overkomen. Iemand enig idee waar dit aan kan liggen?
[ Voor 81% gewijzigd door almightyarjen op 17-02-2013 22:50 ]
Ik heb vervolgens de Baud-rate ingesteld op 9600 en met mijn Mac en pc een verbinding gelegd met de module. Deze wordt vervolgens ook herkend door het programma en ik kan hem selecteren om mijn code up te loaden maar vervolgens krijg ik deze foutmelding:
avrdude: stk500_recv(): programmer is not responding .
Tijdens het uploaden merk ik wel dat de mac verbinding maakt maar daar houdt het ook bij op.
Ik heb van te voren eerst via usb kabel de code met de baud-rate geupload. Ook heb ik geprobeerd de reset knop in te drukken voordat ik ging uploaden, maar het mag allemaal niet baten. Heeft iemand een idee wat ik nou fout doe?
De pinnen volgen per rij dus wel de 0.1 inch rastermaat, maar doen dat niet onderling. (als je begrijpt wat ik bedoel..)
Als ik trouwens de spanning over de batterij meet, kom ik op 4,342V, dus weer een totaal andere waarde..
Ik denk dat ik het bordje gewoon vannacht eens onder spanning laat staan, en morgen de batterij nog een keertje opmeet, ben benieuwd!
[ Voor 21% gewijzigd door WVL_KsZeN op 17-02-2013 23:04 ]
/me heeft eindelijk ook een icoontje.. woef.. boeien..
ik probeer de crc16 te berekenen, maar voorlopig slaag ik er niet in (denk ik)
ik gebruik de crc16.c en crc16.h van deze site
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
| unsigned char mess[] ={0xFF, 0xFF, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0xC3, 0x47, 0x15}; unsigned short resultaat; unsigned short crcBuffer =0; int led = 13; #include "crc16.c" als ik dit wis compileert hij zonder errors, met crc16.c en crc16.h in dezelfde map. void setup() { // put your setup code here, to run once: resultaat = crcsum(mess, 10, crcBuffer); Serial.begin(9600); Serial.print(resultaat); } void loop() { // put your main code here, to run repeatedly: } |
Heeft er iemand dit werkend?
Is het wel mogelijk de Arduino te programmeren via bluetooth? De module wordt aangestuurd door je programma op de Arduino en dat programma probeer je te veranderen....tweakG5 schreef op zondag 17 februari 2013 @ 22:49:
Ik heb een probleem met de bluetoothmodule bij mijn Arduino UNO. Ik heb deze een aantal dagen geleden ontvangen: http://www.ebay.com/itm/A...ain_0&hash=item2321fa27b9 .
Ik heb vervolgens de Baud-rate ingesteld op 9600 en met mijn Mac en pc een verbinding gelegd met de module. Deze wordt vervolgens ook herkend door het programma en ik kan hem selecteren om mijn code up te loaden maar vervolgens krijg ik deze foutmelding:
avrdude: stk500_recv(): programmer is not responding .
Tijdens het uploaden merk ik wel dat de mac verbinding maakt maar daar houdt het ook bij op.
Ik heb van te voren eerst via usb kabel de code met de baud-rate geupload. Ook heb ik geprobeerd de reset knop in te drukken voordat ik ging uploaden, maar het mag allemaal niet baten. Heeft iemand een idee wat ik nou fout doe?
(misschien kan het wel hoor het is mij alleen nooit gelukt
3780wP (18x 210wP EC Solar) | 2x Marstek Venus E (5.12kWh)
Is de bat pin niet gewoon waar je een batterij aan knoopt voor backup power? Hij wordt dan niet opgeladen, enkel als de andere wegvalt schakelt hij op batterij over? Vaak hebben ze gewoon vanaf beide power supplies een shottky diode (low voltage drop) naar de interne power supply van het bordje. Hij pakt dan automatisch degene met hoogste spanning.WVL_KsZeN schreef op zondag 17 februari 2013 @ 22:56:
Klok werkt perfect zonder de BAT pin aan te sluiten (de BAT pin zit ook aan de andere kant van het bordje, zoals je kunt zien..). Wat ook vaag is : de afstand tussen de ene rij pinnen en de andere rij pinnen is 0.975 inch, en niet 1.0 inch. Ook zijn ze op de andere as 0.05 inch ten opzichte van elkaar verschoven.
De pinnen volgen per rij dus wel de 0.1 inch rastermaat, maar doen dat niet onderling. (als je begrijpt wat ik bedoel..)
Als ik trouwens de spanning over de batterij meet, kom ik op 4,342V, dus weer een totaal andere waarde..
Ik denk dat ik het bordje gewoon vannacht eens onder spanning laat staan, en morgen de batterij nog een keertje opmeet, ben benieuwd!
/me heeft eindelijk ook een icoontje.. woef.. boeien..
[ Voor 12% gewijzigd door WVL_KsZeN op 18-02-2013 22:01 ]
/me heeft eindelijk ook een icoontje.. woef.. boeien..
http://youtu.be/pmL5ZZkmAoc
De rover wordt bestuurd door een Mega en het laadstation door een Duemilanove...
Ik vind het altijd geweldig om na te denken wat de NASA 45 jaar geleden gezegd zou hebben als je met zo'n speeltje aan zou komen zetten.almightyarjen schreef op dinsdag 19 februari 2013 @ 00:01:
Daar issie dan: mijn autonome lego rover die bij een bijna lege accu automatisch terugkeert naar zijn laadstation en daar opgeladen wordt
http://youtu.be/pmL5ZZkmAoc
De rover wordt bestuurd door een Mega en het laadstation door een Duemilanove...