rew
four NANDS do make a NOR . Kijk ook eens in onze shop: http://www.bitwizard.nl/shop/
Ik zelf zou voor iedere losse taak voorlopig een Atmega kiezen. Ik ga een vliegding maken, dat ding heeft 8 Atmel CPUs als ie voor het eerst gaat vliegen... 
Je kunt een arduino o.i.d. nemen om te ontwikkelen en als je klaar bent voor 1 taak, kan je een dedicated kleiner ding nemen, of in de eerste instantie een nieuwe arduino nemen, en later kijken of het op een bestaande er bij kan. Met voor 1.30 een Attiny48 kan je ontwerpen voor de atmega 168, en zien of je later een goedkopere '48 er op zet.
[Bericht gewijzigd door rew op (52%)]
dat is ook een slimme oplossing, maar ik ben zelf het meest gecharmeerd van de embedded linux. Een miniatx gebruikt volgens mij veels te veel stroom. Maar ik kan nergens een embedded bordje voor een lage prijs vinden. Weet iemand een adresje? Of kan ik beter een gemodde router gebruiken?
ik wil voor dit project sowieso overschakelen op C, als ik voor de UC kies, kan ik dan beter een avr met gcc of een picje met mikroc? Voor beiden heb ik de spullen (proggers ed.) maar niet de kennis. Dus ik zal iets moeten leren (wel van C, maar niet voor UC's), maar welke van de twee?
edit:
En een arm? Is dat niet wat?
rew
four NANDS do make a NOR . Kijk ook eens in onze shop: http://www.bitwizard.nl/shop/
Een arm is een wat grotere processor. Daarom voor hobbyisten lastiger zelf op een bordje te solderen. Voor de rest een heel comfortabele processor.
't is vrij lastig om goedkope linux-capable devices te vinden. Op de een of andere manier blijft dat duur.
Als je voor ARM gaat, zou ik een kant-en-klaar development bordje kiezen.
zoiets:
http://www.antratek.nl/ARM-Cortex.html
en dan deze:
mbed NXP LPC1768
Met de mbed module kunt u eenvoudig programma's in C++ ontwikkelen via een web interface. U heeft de ARM RealView compiler met een groot aantal libraries gratis ter beschikking en laadt uw programma via de USB interface in de module, zonder dat u iets op uw PC hoeft te installeren.
€68,48
ISOLA2
Groeten René
Ben zelf zeer tevreden van deze
http://www.parallax.com/tabid/407/Default.aspx
8 cpu 32 I/O uitgebrijde bibliotheek, kun je een voor een de functies ontwikkelen , eenvoudige debug
ik vind die mbed er wel heel leuk uit zien, zeker omdat veel functies er al op zitten, zoals een ethernet chippie en opslag. Het heeft wel een hoog arduino gehalte...
http://hackaday.com/2009/11/21/review-mbed-nxp-lpc1768-microcontroller…
De compiler (web based
) van die mbed ziet er verder wel goed uit, en veel voorbeelden en libraries. Hoe zit dat bij die propeller? Is daar überhaubt een goede gratis C compiler voor te vinden, want dat is wel een vereiste.
ISOLA2
Groeten René
Kijk eens bij de downloads ? prog zelf in SPIN en assembly
http://www.parallax.com/ProductInfo/Microcontrollers/PropellerGeneralI…
Anders je vraag stellen op forum van parallax
Hetgeen mij vooral aangetrokken heeft aan deze MC is de lage instapdrempel, en al de tools die je gratis kunt gebruiken.
Ben op dit ogenblik een groter schip aan het bouwen omdat mijn huidig varend schip aan max gewicht zit, ben zinnens compas en GPS te plaatsen.http://isola2.blogspot.com/2009_04_01_archive.html
[Bericht gewijzigd door ISOLA2 op (40%)]
Hmm, ik ga niet nog een taal leren. Ik ben nu maar begonnen de gps in mikroc werkend te krijgen:
// Variables
int i = 0;
int received = 0;
char DataType[] = "GPXXX";
char NMEA[] = "$xxxxx,xxxxxxxxx,xxxx.xxx,x,xxxxx.xxx,x,x,xx,x.x,xxx.x,x,xx.x,x,,*xx";
char receive;
// End Variables
sbit LCD_RS at RB3_bit;
sbit LCD_EN at RB0_bit;
sbit LCD_D7 at RB7_bit;
sbit LCD_D6 at RB6_bit;
sbit LCD_D5 at RB5_bit;
sbit LCD_D4 at RB4_bit;
// Pin direction
sbit LCD_RS_Direction at TRISB3_bit;
sbit LCD_EN_Direction at TRISB0_bit;
sbit LCD_D7_Direction at TRISB7_bit;
sbit LCD_D6_Direction at TRISB6_bit;
sbit LCD_D5_Direction at TRISB5_bit;
sbit LCD_D4_Direction at TRISB4_bit;
void main() {
CMCON = 7; // Disable Comparators
PORTB = 0xFF;
TRISB = 0xff;
Delay_ms(500);
Lcd_Init(); // Initialize LCD
Lcd_Cmd(_LCD_CLEAR); // Clear display
Lcd_Cmd(_LCD_CURSOR_OFF); // Cursor off
UART1_Init(9600); // Initialize UART for GPS board connectivity
// LCD Stuff
while(1) {
if (UART1_Data_Ready() == 1) {
receive = UART1_Read();
if (receive == '$') // Check if sentence begins.
{
received = 0;
do{
if (UART1_Data_Ready() == 1)
{
UART1_Read_Text(DataType, ",", 10); // Capture GPXXX word
received = 1;
}
} while(received == 0);
// If it is GPGGA Data, then acquire it.
if ((DataType[2] == 'G') && (DataType[3] == 'G') && (DataType[4] == 'A'))
{
received = 0;
do{
if (UART1_Data_Ready() == 1)
{
UART1_Read_Text(NMEA, "*", 100); // Stop at *XX checksum data
received = 1;
}
} while(received == 0);
// Fill LCD with relevant data
// Latitude
LCD_Chr(1, 1, NMEA[10]);
LCD_Chr(1, 2, NMEA[11]);
LCD_Chr(1, 4, NMEA[12]);
LCD_Chr(1, 5, NMEA[13]);
LCD_Chr(1, 7, NMEA[15]);
LCD_Chr(1, 8, NMEA[16]);
LCD_Chr(1, 9, NMEA[17]);
LCD_Chr(1, 10, NMEA[18]);
LCD_Chr(1, 11, NMEA[19]);
LCD_Chr(1, 12, NMEA[21]);
// Longitude
LCD_Chr(2, 1, NMEA[23]);
LCD_Chr(2, 2, NMEA[24]);
LCD_Chr(2, 3, NMEA[25]);
LCD_Chr(2, 5, NMEA[26]);
LCD_Chr(2, 6, NMEA[27]);
LCD_Chr(2, 8, NMEA[29]);
LCD_Chr(2, 9, NMEA[30]);
LCD_Chr(2, 10, NMEA[31]);
LCD_Chr(2, 11, NMEA[32]);
LCD_Chr(2, 12, NMEA[33]);
LCD_Chr(3, 13, NMEA[35]);
}
receive = "x";
}
}
}
}
Wat werkt er wel?
Hij ontvangt blijkbaar de data goed, aangezien alles op de juiste plek klomt, en de GPGGA ook heelhuids binnenkomt. Dit weet ik omdat er anders überhaubt niets op het lcd zou komen
Wat werkt er niet?
Er komen in plaats van de gehoopte cijfers tekens op het scherm.
Ik heb geen verstand van communicatie en C, maar "weet" ie wel dat ie ascii moet ontvangen?
En klopt die 9600 wel? NMEA is eigenlijk per defenitie 4800/8/n/1.
nmea snelheden zijn steeds weer anders, maar deze module gebruikt echt 9600. Hij weet ook dat hij ascii moet ontvangen, want als hij gpgga niet binnenkrijgt zet hij niets op het beeldscherm. Ik denk dat het eerder fout gaat bij het tonen op het beeldscherm, hoewel het commando LCD_Chr er voor bedoeld is om ascii te tonen. Dat heb ik ook nog specifiek getest. In een uart test deed ik dit:
if (UART1_Data_Ready() == 1) {
ontvang = UART1_Read();
LCD_Chr(1,1, ontvang);
}
dat werkt wel, het enige verschil is dat dit geen uart functie gebruikt met een wacht functie (in picbasic gebruik je daar WAIT bij SERIN voor).
Op 14 mei 2010 10:05:13 schreef pientertje:
nmea snelheden zijn steeds weer anders, maar deze module gebruikt echt 9600....
Dat kan, gebeurt meer. Maar NMEA is per defenitie 4800 via RS422. Dat er apparaten zijn die afwijken is een tweede.
Maar goed, bij gebrek aan kennis van communicatie en C kom ik ook niet verder dan de hints die ik gaf. Even wachten tot de experts wakker zijn dus.
rew
four NANDS do make a NOR . Kijk ook eens in onze shop: http://www.bitwizard.nl/shop/
Moderne GPS units kunnen 4 of 5x per seconde een locatie doorgeven. Dat haal je op 4800 baud niet meer....
Doet je lcd_chr functie het?
void lcd_string (int x, int y, char *string)
{
while (*string) {
lcd_chr (x++, y, *string++);
}
}
....
lcd_string (1,1,"hello world");
Dan: Kan je bijvoorbeeld een hex getal printen? Maak die functie zelf maar.
Print dan eens nmea[0], nmea[1] etc. voorzichtig kijken hoe ver je komt....
stap voor stap debuggen.
thanks, daarmee krijg ik (een deel van) de nmea string op mn lcd. Alleen het begin past er op dus daarom zie ik alleen de tijd met wat komma's erachter. De string staat dus wel goed in het geheugen. Maar waarom gaat het op de andere manier fout?
edit:
snap er nou niets meer van, ging ik de wijzigingen weer langzaam terugveranderen net zolang het niet meer zou werken. Blijkt dat mn originele programma op eens werkt. Toch maar eens het verschil zoeken met wat ik gisteren postte en nu heb.
edit2:
probleem gevonden, gisteren was er één } meer aan het einde
één teveel dus...
edit3(18-5)
Toch geen { te veel, gewoon geen fix...
Op 14 mei 2010 11:53:15 schreef rew:
Moderne GPS units kunnen 4 of 5x per seconde een locatie doorgeven. Dat haal je op 4800 baud niet meer....
Dat zal dan NMEA2000 zijn. Dat is op een snelle CAN bus in plaats van over een RS422 op 4800baud zoals de oude vertrouwde NMEA0183.
--edit--
NMEA0183 V4.00 ofwel NMEA0183-HS draait op 38400baud. Ik liep wat achter 
[Bericht gewijzigd door GJ_ op (12%)]
ISOLA2
Groeten René
Waarschijlijk door vergelijking van de lichtwaardes van deze led's,
0° zijn alle waardes gelijk, beweeg je het vaantje naar links of rechts dan veranderd de reflexie en kun je daaruit de stand berekenen. Voor je dit op je boot gebruikt testen of je bij het bewegen van de vaan geen weerstand voeld. Voor een goede werking moet de vaan ook gebalanceerd zijn, anders krijg je bij helling een afwijking.
er is bijna geen weerstand omdat het reflectieplaatje niet vast zit aan de windvaan. Het vaantje zit op een dopje, in dat dopje zitten twee magneten. Dit dopje draait op een pennetje. Aan de binnenkant zit het plaatje met op de achterkant het contra magneetje. Dit zorgt voor een minimale weerstand, en ook niet onbelangrijk een waterdichte verbinding.
edit:
heb even de spanningen over de verschillende ldr's gemeten met het windvaantje in verschillende standen:
De spanning van twee tegenoverstaande ldr's is steeds samen de voedingsspanning (12v). Dit is ook niet zo heel raar aangezien ze een spanningsdeler vormen. Ik zal dit nog proberen in een grafiek te zetten en te kijken hoe ik met vier spanningen een positie kan bepalen.
edit2:
een grafiekje met de verhoudingen tussen de twee spanningen aangegeven. Dit ziet er wel interessant uit. Nu moet hier nog een formule uit te halen zijn.
[Bericht gewijzigd door pientertje op (13%)]
Als je het grafiekje repeteert valt het op dat het twee sinussen zijn die uit fase lopen.
Heb een klein probleempje nog met mn c code:
for (y=11;y!=19;y++)
{
if (y==15)
y++;
tus = lati;
lati = fact * (NMEA[y] - 48);
lati = tus + lati; //<----- vastlopen!!!
fact = fact / 10;
}
lati = 52.211383;
}
In dit stukje converteer ik een string naar een float, net zoals ik in picbasic deed. Alleen loopt de pic vast bij deze regel:
lati = tus + lati; //<----- vastlopen!!!
Ik geef lati verderop een waarde, dus ik kan zien of het op het beeldscherm komt. Als ik die ene regel weghaal loopt hij wel door en komt mijn handmatig ingevoerde waarde wel op het scherm. Anders blijft het scherm leeg. Wat ook vreemd is aangezien er dan al wat op het scherm had moeten staan voordat die routine wordt aangeroepen.
hele code:
// Variables
int i = 0;
int received = 0;
char y;
char DataType[] = "GPXXX";
char NMEA[] = "$xxxxx,xxxxxxxxx,xxxx.xxx,x,xxxxx.xxx,x,x,xx,x.x,xxx.x,x,xx.x,x,,*xx";
char receive;
double lati, longi, tus, fact;
char datadisp[15];
// End Variables
sbit LCD_RS at RB3_bit;
sbit LCD_EN at RB0_bit;
sbit LCD_D7 at RB7_bit;
sbit LCD_D6 at RB6_bit;
sbit LCD_D5 at RB5_bit;
sbit LCD_D4 at RB4_bit;
// Pin direction
sbit LCD_RS_Direction at TRISB3_bit;
sbit LCD_EN_Direction at TRISB0_bit;
sbit LCD_D7_Direction at TRISB7_bit;
sbit LCD_D6_Direction at TRISB6_bit;
sbit LCD_D5_Direction at TRISB5_bit;
sbit LCD_D4_Direction at TRISB4_bit;
void omzetten()
{
/*
latf = 0
longf = 0
fact = 10
For y = 0 To 9
If y = 4 Then y = y + 1
tus = latf
latf = fact * (Lat[y] - 48)
latf = latf + tus
fact = fact / 10
Next y
*/
lati = 0;
longi = 0;
fact = 10;
for (y=11;y!=19;y++)
{
if (y==15)
y++;
tus = lati;
lati = fact * (NMEA[y] - 48);
lati = tus + lati; //<----- vastlopen!!!
fact = fact / 10;
}
lati = 52.211383;
}
void main() {
CMCON = 7; // Disable Comparators
PORTB = 0xFF;
TRISB = 0xff;
Delay_ms(500);
Lcd_Init(); // Initialize LCD
Lcd_Cmd(_LCD_CLEAR); // Clear display
Lcd_Cmd(_LCD_CURSOR_OFF); // Cursor off
UART1_Init(9600); // Initialize UART for GPS board connectivity
// LCD Stuff
while(1) {
if (UART1_Data_Ready() == 1) {
receive = UART1_Read();
if (receive == '$') // Check if sentence begins.
{
received = 0;
do{
if (UART1_Data_Ready() == 1)
{
UART1_Read_Text(DataType, ",", 10); // Capture GPXXX word
received = 1;
}
} while(received == 0);
// If it is GPGGA Data, then acquire it.
if ((DataType[2] == 'G') && (DataType[3] == 'G') && (DataType[4] == 'A'))
{
received = 0;
do{
if (UART1_Data_Ready() == 1)
{
UART1_Read_Text(NMEA, "*", 100); // Stop at *XX checksum data
received = 1;
}
} while(received == 0);
// Fill LCD with relevant data
if (NMEA[36]==49)
{
// Latitude
LCD_Chr(1, 1, NMEA[11]);
LCD_Chr(1, 2, NMEA[12]);
LCD_Chr(1, 4, NMEA[13]);
LCD_Chr(1, 5, NMEA[14]);
LCD_Chr(1, 6, 39);
LCD_Chr(1, 7, NMEA[16]);
LCD_Chr(1, 8, NMEA[17]);
LCD_Chr(1, 9, NMEA[18]);
LCD_Chr(1, 10, NMEA[19]);
LCD_Chr(1, 11, 34);
LCD_Chr(1, 12, NMEA[0]);
LCD_Chr(1, 13, NMEA[1]);
LCD_Chr(1, 15, NMEA[2]);
LCD_Chr(1, 16, NMEA[3]);
omzetten();
FloatToStr(lati,datadisp);
LCD_Out(2,1,datadisp);
}
else
{
LCD_Out(1,1,"no fix");
}
}
receive = "x";
}
}
}
}
heb het probleem gevonden, maar niet opgelost. Het gaat fout bij het optellen van floats als er een variabele in voorkomt.
var = 0.3 + 0.2; //=0.5
FloatToStr(var,datadisp);
LCD_Out(1,1,datadisp);
//maar
tus = 0.3;
var = tus + 0.2 //=bullshit
FloatToStr(var,datadisp);
LCD_Out(1,1,datadisp);
kan iemand dit bevestigen...
Heb nu ook eengrafiekje gemaakt van de windvaan waar volgensmij een absolute positie uit te halen is:
[Bericht gewijzigd door pientertje op (27%)]
Ok, alles werkt nu. Een update van de compiler deed wonderen:P
Heb nu ook het stukje geschreven dat de koers uitrekend. Dat werkt goed, alleen is het door de gebrekkige floats van de picjes niet op de tiende graad nauwkeurig... Nou is dat niet zo'n ramp, maar bij het uitrekenen van de afstand is het helemaal een ramp en scheelt het zo een halve kilometer.
Heb ook vanmiddag mn kompasje uit hongkong binnen. Heb geen moment rust 
jovak
meten is weten, weten is meten, maar hoe kan je weten wat je allemaal moet meten en weten.
Op 18 mei 2010 16:18:46 schreef pientertje:
Als je het grafiekje repeteert valt het op dat het twee sinussen zijn die uit fase lopen.
Sinus Cosinus ?
Een sinus en een cosiunus zijn twee sinussen die uit fase lopen. 
Heb nu het vaantje aan mn picje gehangen en kan nu wat handiger meten. Ik kan nu met behulp van een GR de positie van de vaan berekenen.
De forumules van de twee sinussen zijn:
1:
2,375+1,005*sin(x)
2:
2,845+1,155 * sin(x+\frac{1}{2}\pi)
Maar nu weet ik even niet hoe ik dit met "gewone" wiskunde kan uitrekenen zonder mn intersect. Hoe ik het nu met de GR uitreken. Stel ik meet:
1: 1,960
2: 3,936
Dan doe ik een intersect van 1,960 en formule 1. Dan zijn er meer mogelijkheden. Ik kijk welke bij welke oplossing formule 2 het dichtst bij 3,936 komt. Maar hoe doe ik dit zonder intersect en getekende grafieken?
edit:
gnuplot skilzzz
ISOLA2
Groeten René
Even je grafiek geleend
Als je een lijn trekt door je 2 grafieken zie je inderdaad dat er maar 1 X om de 360° een oplossing is. Dus de exacte plaats van het vaantje is dus bepaald.
Om met deze spanningen te kunnen werken ze via een A/D convertor of MC omzetten van analoog naar een digitale waarde vb. 4 V = 256 en deze kun je in je prog. gebruiken
ik ben er uit, op het wiskundeforum (ja, internet verbroederd) hebben ze me dit verteld:
Wat je dus wilt weten is het volgende:
alle waarden voor x waarvoor geldt: f(x)=1.96.
Vervolgens wil je voor die x-waarde g(x) weten?Hiervanuitgaande een methode:
f(x)=2.375+1.005\cdot \sin(x)=1.96
Welke waarde heeft sin(x)?
Gebruik vervolgens sin(x)=a, x=\arcsin(a), anders geschreven: x=sin^{-1}(a)Je vindt dan een oplossing. Voor de andere:
gebruik de symmetrie van sin(x). Los op: sin(x)=-1. Deze oplossing is het gemiddelde van de 2 waarden voor x die in f(x), 1.96 geven.Kom je zo verder?
Nu nog even verder coden, heb het kompasje ook aan de praat met de uart tool van mn pickit.







