TauLabs/PicoC: Scripting

odwquad

Erfahrener Benutzer
#82
Daaanke cGiesen für diesen heißen Tipp mit dem Editor (Notepad 2). Jetzt habe ich schonmal einen seeehr großen dummen Anfängerfehler gefunden.
Wenn man ein Kommentar mit /* einleitet sollte man es mit */ wieder ausleiten. Daher, der ganze Code war als Kommentar Deklariert, und somit konnte er ja gar nichts ausführen. :D :eek:
 

odwquad

Erfahrener Benutzer
#84
so jetzt funktioniert das soweit. Jetzt kommt über das Terminalfenster aber die Fehlermeldung:
.}
. ^
nofile:164:15 out of memory
ich habe in den Memory Settings den max file size auf 6000 bytes gesetzt

Jetzt bleibt mein komplettes Programm drin, aber wird eben nicht ausgeführt.
Ich vermute mal, dass ich jetzt Task Stack Size und PicoC stack size ebenfalls erhöhen muss.
 

cGiesen

Erfahrener Benutzer
#85
Zeig mal Deinen Code.

NoFile heißt wohl, dass Du den Code nicht im File Spicher hast, sondern 'nur' im Speicher.

Die Zahl ist vermutlich Zeile/Spalte.

da ich über UART meine RGB LEDs steuer, habe ich kein Terminal angeschlossen.
Hier wäre cool, noch was zu haben, dass es auch ohne geht....
 

odwquad

Erfahrener Benutzer
#86
und wie schiebe ich den in Filespeicher? Ich habe ihn so ausgeführt wie im Wiki bei dem Beispiel erklärt wurde.

anbei der Code:
Code:
/* Beleuchtungssteuerung:
/* Steuert die Beleuchtung des Quadrocopters

/*Pinbelegung Quanton: */
/*RS232 Schnittstelle = WS2812 LEDs */
/*PWM Out 10 = LEDs
/*PWM Out 11 = Summer */

#include "system.h"
#include "flightbatterystate.h"



// Variablen Deklarieren: 
short LEDupdate=1;
short TMPArmed=2;
short r=0,g=0,b=0;
int Summervar=0;
short LEDblOn=0;
Short WS2812On=0;


/* WS2812 library */
#define nLED 10
unsigned char bufLED[nLED*3];


void setLED(unsigned short n, unsigned char r, unsigned char g, unsigned char b) 
{
	if (n < nLED) 
	{
		unsigned short offset = 3*n;
		bufLED[offset++] = r;
		bufLED[offset++] = g;
		bufLED[offset++] = b;
	}
}


void sendLED() {
	ChangeBaud(9600);
	SendBuffer(bufLED, sizeof(bufLED));
}
/* end of RGB-LED library */


/*Batteriestatus: */
FlightBatteryStateData BatteryData;
short TMPBattery=4;

void batterystatus()
{
	FlightBatteryStateGet(&BatteryData);
	if ((BatteryData.Voltage < 10.4) && (TMPBattery != 1))
	{
		TMPBattery = 1;
		Summervar=2000;
	}
	if ((BatteryData.Voltage < 10.8) && (BatteryData.Voltage > 10.4) && (TMPBattery != 2))
	{
		TMPBattery = 2;
		Summervar=1000;
	}
	if ((10.8 > BatteryData.Voltage) && (TMPBattery != 3))
	{
		TMPBattery = 3;
		Summervar=0;
	}
	PWMOutSet(11,Summervar);
}

/*WS2812 LEDs schalten (Farben definieren): setLED(n,r,g,b); */
void PosLEDs()
{
	int n=1
	while(n<3)
	{
		setLED(n,255,0,0);
		n=n+1;
	}
	while(n<5)
	{
		setLED(n,0,255,0);
		n=n+1;
	}
	while(n<7)
	{
		setLED(n,0,0,255);
		n=n+1;
	}
	while(n<10)
	{
		setLED(n,0,255,255);
		n=n+1;
	}
}
void PosLEDsAus()
{
	int n=1
	while(n<3)
	{
		setLED(n,0,0,0);
		n=n+1;
	}
	while(n<5)
	{
		setLED(n,0,0,0);
		n=n+1;
	}
	while(n<7)
	{
		setLED(n,0,0,0);
		n=n+1;
	}
	while(n<10)
	{
		setLED(n,0,255,0);
		n=n+1;
	}
}


TestValSet(1);


TestValSet(2);
while(TestValGet() > 0)
{
	batterystatus();
	printf("Summerstatus: ");
	printf(Summervar);
	printf(" \n");


	if (armed() && (TMPArmed != 1))
	{	
		PosLEDs();
		LEDblOn = 1;
		TMPArmed = 1;
		LEDupdate=1;
 	} 
	else if (!armed() && (TMPArmed != 0))
	{
		PosLEDsAus();
		LEDblOn = 0;
		TMPArmed = 0;
		LEDupdate=1;
	}



	/* BlinkLEDs ein-/ausschalten */
	if (LEDblOn == 1)
	{
		PWMOutSet(10,2000);
	}
	else
	{
		PWMOutSet(10,0);
	}

	

	if (LEDupdate == 1) 
	{
		sendLED();
		LEDupdate = 0;
	}

	delay(500);
}
TestValSet(99);
 
Zuletzt bearbeitet:

cGiesen

Erfahrener Benutzer
#87
Oben gibt es neben den Button zum Hochladen auch ein Button zum Hochladen ins UAV System.
Tooltipp: "Save to UAV File!

ich habe daneben noch 1 ausgewählt und in den Modulsettings
Startup Mode = On Boot
Und File = 1
 

odwquad

Erfahrener Benutzer
#88
So ich bin jetzt schonmal etwas weiter gekommen. Danke aber ersteinmal CGiesen für die Info. Jetzt weiß ich auch wie ich das Skript später automatisch starten lassen. Wenn ich es richtig verstehe, besteht die Möglichkeit mehrere Skripte einzuspielen, und über die Bootfile ID das entsprechende Skript auszuwählen? Sehe ich das Richtig?

Ansonsten funktioniert mein Code einigermaßen. Zumindest kommt keine Fehlermeldung.

Das einzigste was nicht funktioniert ist dieser Teil:
Code:
if (armed() && (TMPArmed != 1))
	{	
		PosLEDs();
		LEDblOn = 1;
		TMPArmed = 1;
		LEDupdate=1;
 	} 
	else if (!armed() && (TMPArmed != 0))
	{
		PosLEDsAus();
		LEDblOn = 0;
		TMPArmed = 0;
		LEDupdate=1;
	}
Diesen Teil habe ich aus deinem Codebeispiel kopiert gehabt, aber er funktioniert nicht. Da kommt dann die Fehlermeldung
.}
. ^
nofile:164:15 out of memory
Außerdem gibt er mir die Variable nicht im Terminal aus. Ich hab es mit
Code:
printf(Summervar);
probiert, aber diesen Teil ignoriert er scheinbar?
Deklariert habe ich Summervar mit:
Code:
int Summervar=0;
geht das generell nicht, oder ist das mein Fehler? Eigentlich müsste er doch dann im Terminal immer 0 ausgeben, bzw den Wert dem ich Summervar zugewiesen habe:???:

Jaja mühsam ernährt sich das Eichhörnchen :D
 

cGiesen

Erfahrener Benutzer
#89
Schau mal unter den PicoC Settings in den Modulen. Da kann man den Stack erhöhen. Ich habe vorne die 1 jeweils durch 2 ersetzt.
Danach ging es.

Schön wäre es, wenn man diesen Wert genauer ermitteln kann, damit man nicht zu viel macht.
Vielleicht fehlt das wo anders.
 

odwquad

Erfahrener Benutzer
#90
soo ich melde mich mal wieder zu Wort :D
Danke cGiesen für dein HEX file und deine Hilfe. Ich habe jetzt in meiner Abwesenheit am Quadrocopter die kompletten LEDs montiert (waren ganz schön viele Kabel) und mir so ein kleinen Attiny85 geflashed und angeschlossen.
Dein Beispielprogramm funktioniert schonmal.

Warum auch immer funktioniert bei mir am Laptop Arduino nicht mehr. Da kommt immer die Fehlermeldung "not in sync". Ich hatte das Problem schonmal mit meinem PC. Dort habe ich es nach Tagelangem Treiber installieren und deinstallieren irgendwann wieder zum laufen gebracht. Meine anderen Ardunioboards werden auf jeden Fall auch nicht mehr erkannt :-(

naja andere Baustelle. Ich poste später mal ein paar Bilder :D
 

ernieift

Erfahrener Benutzer
#91
Code:
printf(Summervar);
Kann nicht gehen. Die Funktion schreibt formatierten Text.
Code:
printf("%d\n",Summervar);
Geht besser.
 

cGiesen

Erfahrener Benutzer
#92
Mir raubt PicoC noch den letzten Nerv.

Ich habe gerade mal wieder ein Update gemacht und prompt läuft mein Script nicht mehr.

Gibt es eine Chance, den Fehler auch in die GUI zu holen (wenn diese nicht mal wieder die Verbindung zur GCS verloren hat) ?
 

odwquad

Erfahrener Benutzer
#95
Hat man den mit picoC die Möglichkeit die Höhe zu überschreiben bevor der Regelkreis beginnt? Also angenommen i2c funktioniert und man hat die Höhe mit dem Sensor gemessen.

Auf jeden Fall bräuchte man noch ein 2 achs gimbal dafür.
Sonst gäbe es beim Neigen des quads Messfehler.
 

ernieift

Erfahrener Benutzer
#96
@joergrohde: Habe schon lange nach einem LIDAR-Sensor gesucht. Danke fürs finden :) und ja, I2C kommt noch für PicoC. Ist eigentlich ziemlich einfach einzubauen. Sind ja nur 2 Funktionen (READ/WRITE). Am Wochenende hatte ich aber keine Lust (gähn).

@odwquad: Den Barowert sollte/kann man nicht überschreiben. PicoC kriegt noch einen eigenen Flugmodus ähnlich dem Tabletcontrol. Da kannst Du dann die Höhe selber regeln oder Loopings programmieren ;). Zum Höhe halten müsstest Du dann einen eigenen PID-Regler aufsetzen. Dafür habe ich ja schon PID-Funktionen eingebaut.

Wenn das Wetter nicht so sch.. wäre, würde ich lieber mit meiner Raketen-Leora üben gehen. Wie filmt man eigentlich am besten per 'Helmkamera'? Ich wollte mal ein Video in Ego-Perspektive machen.

gruss
jörg
 

ernieift

Erfahrener Benutzer
@joergrohde: Habe gerade mal die i2c Funktionen für picoC eingebaut. Funktioniert etwa so:
Code:
/*
int i2c_read(port,device,buffer,length);
int i2c_write(port,device,buffer,length);
*/

#include "system.h"
int test=0;
TestValSet(i2c_read(0,30,&test,1));
TestValSet(test);
Die Funktionen liefern 0 als Rückgabe, wenn alles ok ist. Negative Werte sind Fehler. Derzeit habe ich es auf dem Quanton scharf gemacht. Als Port gehen Werte von 0..2. Auf dem Quanton ist 0 intern und 1/2 sind die externen Ports. Zum Testen werde ich noch eine Testschaltung mit einem 16-Bit Port zusammenstecken. Später kann man dann noch den NeoPixel auf I2C aufbohren. Das müsste der sogar ohne Softserial können. So kann man dann mehrere Dinge gleichzeitig betreiben und der USART ist noch frei.
Zu finden ist das ganze in meinem picoC-Repo.
 
FPV1

Banggood

Oben Unten