Tau Labs Software unterstützt vielfältige Hardware

cGiesen

Erfahrener Benutzer
PicoC
Ich habe es jetzt einigermassen hinbekommen.
Man darf nur nicht Putty nehmen.
Unter Windows benutze ich "Tera Term"
Code ist jetzt drin.
Hätte nicht gedacht das es so mühsam ist.

Ich hänge nur bei der LED
Ich finde den Beitrag nicht mehr wo ernieift den Hardware Aufbau beschrieben hat.

Kannst Du den noch mal beschreiben bitte.
Hat aber Zeit, ich gehe jetzt ins Bett. Frust weg schlafen....
 

ernieift

Erfahrener Benutzer
Mache ich doch glatt...

Code:
Out5---R---LED---GND
Der Widerstand ist ziemlich egal sollte aber nicht kleiner als 300Ω sein.

Da der LED-Demosource über einen AccessoryChannel läuft, muss noch dafür gesorgt werden, dass der auch irgendwo hingeht.
Los geht's:
Die Werte im AccessoryVal gehen von -1 (-100%) bis +1 (+100%).
Man sucht sich also einen freien Output (hier Out5) und parametriert ihn entsprechend . Für einen Servo braucht man nichts einzustellen (1000..2000µs) sind als Steuersignal ok.
Für eine LED ist natürlich Min = 0 (für Aus) und Max=20000µs (für 100% bei 50Hz). Neutral sollte in der Mitte (10000µs) liegen. Das entspricht dann einem AccessoryVal von 0 (ansonsten ergibt die Funktion einen nichtlinearen Verlauf).
Nun noch den Accessorykanal 0 mit dem Out5 verbinden. Dazu in den Mixersettings Mixer5Type=Accessory0 eintragen und abspeichern. Damit werden die Werte aus dem Accessory0 dem Output5 zugewiesen.

Nur nebenbei: Man kann auch einen TX-Kanal auf einen Accessory legen und sich damit die Werte in PicoC holen. Eventuell einen Schalter oder Poti um damit den Programmverlauf zu beeinflussen. Die entsprechende Funktion ist dann AccessoryValGet(Kanal).
Wenn ich es morgen (ist ja schon heute) schaffe, dann baue ich noch eine Funktion zum Lesen eines beliebigen Kanals aus der Funke ohne die Accessory zu benutzen. Damit könnte man mehr als nur 3 zusätzliche Kanäle benutzen. Der Returnwert wäre dann aber nicht (-1..+1) sondern der entsprechende µs-Wert. Bei SUMD sind das 1000..2000µs. Negative Werte kennzeichnen dann Signalausfall oder einen nicht vorhandenen Kanal.
Ich weiss, dass es vielleicht etwas kompliziert klingt, aber es ist ja auch frei programmierbar. Am besten im interaktiven Modus ein paar Sachen ausprobieren, bevor man mit dem Copter in die Luft geht.

An Alle: Warnung!!! Wenn das eigene Script aufgrund eines Fehlers abstürzt (damit meine ich keine Syntaxfehler), kann auch die ganze Firmware folgen. Das sollte jedem klar sein! Man ist also selbst dafür verantwortlich, dass man nicht z.B. durch 0 dividiert oder tan(pi/2) berechnet. Ist wie bei fast allen Dingen: Das Problem sitzt immer vor dem Bildschirm. Man installiert sich ja auch nicht eine Beta-Firmware und fängt dann an zu meckern wenn etwas nicht klappt. Hier schreibt man die Alpha und Beta sogar selber :). Bitte beachten. Na dann weiterhin viel Spass.

Übrigens schön, dass sich jemand ums Wiki kümmert. (Fast) alle Funktionen finden sich in picoc_library.c.

vg ernieift

PS: Vielleicht findet sich ja bald jemand, der den gcs-Part übernimmt. Dann sollte es mit dem Upload aus einfacher gehen. Das wird wohl erst nach dem PR passieren.
 
Zuletzt bearbeitet:

ernieift

Erfahrener Benutzer
Hallo,
damit hier niemand den Spass verliert, habe ich mal eine kleine Anleitung zum Testen von eigenen Sources gebaut. Es kann im interaktiven Modus schnell dazu kommen, dass der USART-Puffer überläuft und der Interpreter dann misst baut, da er nicht das interpretiert, was wir geschrieben haben. Daher ist es bei grossen Programmen besser, den Source in den Puffer zu bringen und dann von da auszuprobieren.
Ich habe es jetzt so probiert und halte es für praktikabel:

* PicoCSettings->Startup=WhenArmed
* PicoCSettings->Source=File

Nun kann man in PicoCStatus->Command zwischen Idle und USARTmode hin- und herschalten. Also:

* PicoCStatus->USARTmode
* CTRL-A, CTRL-B
* Source aus Zwischenablage via Terminal übertragen
* CTRL-C,CTRL-D
* mit CTRL-E kann man nochmal kontrollieren, ob es auch so gelaufen ist wie man es wollte.

Jetzt könnte man entweder gleich auf Idle zurückschalten oder mit SaveFile gleich abspeichern.
Abspeichern ist optional und kann auch später erfolgen.

Wird der Copter einschaltet, so wird auch das Programm gestartet. Also besser Propeller ab o.ä.
Hier mal ein kleines Programm aus dem Testordner vom picoc (bei svn), das ich ein bisschen angepasst habe:
Code:
#include "system.h"
#define MAX_DIGITS 32

/* Print the top line of the digit d into buffer. Does not null terminate buffer. */
void topline(int d, char *p){
 *p++ = ' ';
 switch(d){
  /* all these have _ on top line */
  case 0:
  case 2:
  case 3:
  case 5:
  case 7:
  case 8:
  case 9:
   *p++ = '_';
   break;
  default:
   *p++=' ';
 }
 *p++=' ';
}

/* Print the middle line of the digit d into the buffer. Does not null terminate. */
void midline(int d, char *p){
 switch(d){
  /* those that have leading | on middle line */
  case 0:
  case 4:
  case 5:
  case 6:
  case 8:
  case 9:
   *p++='|';
   break;
  default:
   *p++=' ';       
 }
 switch(d){
  /* those that have _ on middle line */
  case 2:
  case 3:
  case 4:
  case 5:
  case 6:
  case 8:
  case 9:
   *p++='_';
   break;
  default:
   *p++=' ';
 }
 switch(d){
  /* those that have closing | on middle line */
  case 0:
  case 1:
  case 2:
  case 3:
  case 4:
  case 7:
  case 8:
  case 9:
   *p++='|';
   break;
  default:
   *p++=' ';
 }
}

/* Print the bottom line of the digit d. Does not null terminate. */
void botline(int d, char *p){
 switch(d){
  /* those that have leading | on bottom line */
  case 0:
  case 2:
  case 6:
  case 8:
   *p++='|';
   break;
  default:
   *p++=' ';       
 }
 switch(d){
  /* those that have _ on bottom line */
  case 0:
  case 2:
  case 3:
  case 5:
  case 6:
  case 8:
   *p++='_';
   break;
  default:
   *p++=' ';
 }
 switch(d){
  /* those that have closing | on bottom line */
  case 0:
  case 1:
  case 3:
  case 4:
  case 5:
  case 6:
  case 7:
  case 8:
  case 9:
   *p++='|';
   break;
  default:
   *p++=' ';
 }
}

/* Write the led representation of integer to string buffer. */
void print_led(unsigned long x, char *buf)
{
 int i=0,n;
 static int d[MAX_DIGITS];

 /* extract digits from x */
 n = ( x == 0L ? 1 : 0 );  /* 0 is a digit, hence a special case */

 while(x){
  d[n++] = (int)(x%10L);
  if(n >= MAX_DIGITS)break;
  x = x/10L;
 }

 /* print top lines of all digits */
 for(i=n-1;i>=0;i--){
  topline(d[i],buf);
  buf += 3;
  *buf++=' ';
 }
 *buf++='\n'; /* move teletype to next line */

 /* print middle lines of all digits */
 for(i=n-1;i>=0;i--){
  midline(d[i],buf);
  buf += 3;
  *buf++=' ';
 }
 *buf++='\n';

 /* print bottom lines of all digits */
 for(i=n-1;i>=0;i--){
  botline(d[i],buf);
  buf += 3;
  *buf++=' ';
 }
 *buf++='\n';
 *buf='\0';
}

int main()
{
 int n = 0;
 char buf[5*MAX_DIGITS];
 while (armed()){
  print_led(n++, buf);
  printf("%s\n",buf);
  delay(100);
 }
 return n;
}

/* call the program above and generate an exit value */
exit(main());
Folgendes ist dabei wichtig. Bei int main() läuft die Schleife solange der Copter gearmed (sch... Wort) ist.
Die letzte Zeile ruft das Programm auf und schreibt den return-wert von main() in den PicoCStatus->ExitValue.
Es steht jedem frei, seine Programme zu schreiben wie er will. Man kann sich auch die main()-Funktion sparen und alles hintereinander als Script aufrufen. Aber ich denke, so könnte man es verallgemeinern.
 
Zuletzt bearbeitet:

ernieift

Erfahrener Benutzer
Hallo Carsten,
ich habe das mit dem exit() mal zu den Wiki-pages hinzugefügt. Aber besser ist, Du machst da weiter. Der Grund ist einfach: Wenn ich das schreibe, versteht es am Ende niemand. Damit meine ich nicht irgendwelche Übersetzungsfehler. Besser ist wenn es jemand macht, der das einfach nur benutzt. Falls dabei Fragen auftreten, dann kann man die ja gleich im Wiki beantworten...
Ich hoffe, Du bist etwas voran gekommen.
vg ernieift

PS: Habe vorhin noch einen Flankentrigger in die Startbedingung eingebaut. Die Funktion TxChannelGet() ist auch neu. Jetzt kannst Du alle Kanäle Deiner Funke in PicoC benutzen und sparst Du die Accessorykanäle.
 
Zuletzt bearbeitet:

cGiesen

Erfahrener Benutzer
Ich bin in der Halle fliegen. Mein großer hatte Maiden.
Nur die Gimbal macht keinen Spass :( leichtes Zittern (nicht wobbeln) im Bild.
An PicoC gehts, wenn ich wieder zu Hause bin.
 

cGiesen

Erfahrener Benutzer
Heute hatte die ersten erfolgreiche stabiele Flüge mit meinem großem Quad.
[video=youtube;XX10qbhXUyU]http://www.youtube.com/watch?v=XX10qbhXUyU[/video]

Nur mit der Gimbal aus Spanien http://quaternium.es/home/47-brushless-gimbal-for-spidex.html#.UwEkm_l5OSo bin ich so GAR NICHT zufrieden.
Ich habe zwar die erste Version ohne Alu, aber meine sieht im Prinzip genauso aus.
Sie ist speziell für die goPro, aber diese ist überhaupt nicht ausbalanziert :(
 

cGiesen

Erfahrener Benutzer
Hat sich erledigt ;)

Natürlich geht die Arbeit und das Lernen jetzt erst los, aber ein wichtiger Anfang ist gemacht.

@ernieift
Kannst u mir erklären, wie ich Deine Variablen erreiche?
Hast Du da eine Liste?
Sollen wir alles in die GUI holen?
 

Anhänge

Zuletzt bearbeitet:
Hallo, ich bin vollkommen neu in der RC Thematik und habe diesen Wurm erst heute entdeckt.

Wie der Zufall so will, habe ich gerade ein STMF3 Discovery geordert, vorgesehen eigentlich als ST-Variante eines ATmel ISPs.
Habe ich den 2. Beitrag dahingehend richtig verstanden, dass dieses besagte Discovery bereits einen kompletten FC darstellt?
Dass darauf bereits die gleichen Sensoren vorhanden sind wie auf einem Pixhawk und ich nur noch ein Barometer benötige, um mit einem vorhandenen ublox (6m ohne Kompass) loslegen zu können?
Oder habe ich da doch einiges durcheinander geworfen..bei dem ganzen STM Kram blick ich momentan nicht so richtig durch..MW32..Kamikaze...Baseflight...Openpilot...Naze32....etc?
 

ernieift

Erfahrener Benutzer
@Carsten: Mach doch einfach eine Tabelle mit dem Limit und einem Enablehaken für die entsprechende Warnung pro Zeile. Für AltitudeBeep gibt's kein Limit.
Dazu noch eine Liste um die Sensoren ein-/auszuschalten. Wenn ich recht überlege wäre die Sensorliste besser vor den Warnungen.
Wie man an die Variablen kommt, kannst Du bestimmt beim Batteriemodul abschreiben.

PS: Ich würde nichts weglassen. Ist mehr Aufwand als nötig...
 

cGiesen

Erfahrener Benutzer
@ernieift
Code:
[COLOR=#000080]//![/COLOR][COLOR=#000080]Enable[/COLOR][COLOR=#000080]appropriate[/COLOR][COLOR=#000080]tab[/COLOR][COLOR=#000080]when[/COLOR][COLOR=#000080]objects[/COLOR][COLOR=#000080]are[/COLOR][COLOR=#000080]updated

[/COLOR][COLOR=#808000]void[/COLOR][COLOR=#800080]ConfigModuleWidget[/COLOR][COLOR=#000000]::[/COLOR][COLOR=#000000]objectUpdated[/COLOR][COLOR=#000000]([/COLOR][COLOR=#800080]UAVObject[/COLOR][COLOR=#000000]*[/COLOR][COLOR=#000000]obj[/COLOR][COLOR=#000000],[/COLOR][COLOR=#808000]bool[/COLOR][COLOR=#000000]success[/COLOR][COLOR=#000000])

[/COLOR][COLOR=#000000]{

[/COLOR][COLOR=#808000]if[/COLOR][COLOR=#000000](![/COLOR][COLOR=#000000]obj[/COLOR][COLOR=#000000])

[/COLOR][COLOR=#808000]return[/COLOR][COLOR=#000000];[/COLOR]
[COLOR=#800080]QString[/COLOR][COLOR=#000000]objName[/COLOR][COLOR=#000000]=[/COLOR][COLOR=#000000]obj[/COLOR][COLOR=#000000]->[/COLOR][COLOR=#000000]getName[/COLOR][COLOR=#000000]();

[/COLOR][COLOR=#808000]if[/COLOR][COLOR=#000000]([/COLOR][COLOR=#000000]objName[/COLOR][COLOR=#000000].[/COLOR][COLOR=#000000]compare[/COLOR][COLOR=#000000]([/COLOR][COLOR=#800080]AirspeedSettings[/COLOR][COLOR=#000000]::[/COLOR][COLOR=#800000]NAME[/COLOR][COLOR=#000000])[/COLOR][COLOR=#000000]==[/COLOR][COLOR=#000080]0[/COLOR][COLOR=#000000])

[/COLOR][COLOR=#000000]enableAirspeedTab[/COLOR][COLOR=#000000]([/COLOR][COLOR=#000000]success[/COLOR][COLOR=#000000]);

[/COLOR][COLOR=#808000]else[/COLOR][COLOR=#808000]if[/COLOR][COLOR=#000000]([/COLOR][COLOR=#000000]objName[/COLOR][COLOR=#000000].[/COLOR][COLOR=#000000]compare[/COLOR][COLOR=#000000]([/COLOR][COLOR=#800080]FlightBatterySettings[/COLOR][COLOR=#000000]::[/COLOR][COLOR=#800000]NAME[/COLOR][COLOR=#000000])[/COLOR][COLOR=#000000]==[/COLOR][COLOR=#000080]0[/COLOR][COLOR=#000000])

[/COLOR][COLOR=#000000]enableBatteryTab[/COLOR][COLOR=#000000]([/COLOR][COLOR=#000000]success[/COLOR][COLOR=#000000]);

[/COLOR][COLOR=#808000]else[/COLOR][COLOR=#808000]if[/COLOR][COLOR=#000000]([/COLOR][COLOR=#000000]objName[/COLOR][COLOR=#000000].[/COLOR][COLOR=#000000]compare[/COLOR][COLOR=#000000]([/COLOR][COLOR=#800080]VibrationAnalysisSettings[/COLOR][COLOR=#000000]::[/COLOR][COLOR=#800000]NAME[/COLOR][COLOR=#000000])[/COLOR][COLOR=#000000]==[/COLOR][COLOR=#000080]0[/COLOR][COLOR=#000000])

[/COLOR][COLOR=#000000]      enableVibrationTab[/COLOR][COLOR=#000000]([/COLOR][COLOR=#000000]success[/COLOR][COLOR=#000000]);

[/COLOR][COLOR=#00ff00]elseif(ModuleSettings::ADMINSTATE_UAVOHOTTBRIDGE==true)

       enableHoTTTelemetrieTab(true);[/COLOR][COLOR=#000000]

[/COLOR][COLOR=#000000]}

[/COLOR]
Warum wird enableHoTTTelemetrieTab(true); nicht ausgeführt?
Ist enableHoTTTelemetrieTab(true); kein Boolean?

So habe ich mir das vorgestellt.
Stellt sich aber wieder die Frage, warum alle Werte erfassen, wenn Sie derzeit oder nie nicht ermittelt werden (können)
Außerdem würde ich die einzelnen Elemente in Abhängigkeit der gewählten Sensoren enablen oder disablen
 

Anhänge

Zuletzt bearbeitet:

ernieift

Erfahrener Benutzer
Hallo Carsten,
zur gcs-Programmierung kann lch Dir leider nicht viel sagen. Mir ist nur soviel aufgefallen, dass der Compiler nicht so strikt eingestelllt ist wie bei flight. Daher kann es sein, dass er nicht meckert, obwohl Du einen Fehler drin hast.
Zu der Warnings: Es gibt für jedes Limit eine eigene Warnung. D.h. bei Power Voltage Min und Max getrennt. Der Beep wird übrigens unabhängig vom Sensor erzeugt. Wenn Du also nur ein Vario einschaltest, kannst Du trotzdem eine Unterspannungsmeldung bekommen. Ich würde zunächst nichts weglassen. Da es in meinen Augen aufwändiger ist, eine Auswahl zu treffen als einfach alles reinzunehmen.
Ich habe mal vor einer Weile bei den Graupnerinternas gestöbert. Ich glaube man könnte sogar eigene Sprachfiles kreiren. Also wozu weglassen?
QT ist nicht mein Fall. Ich habe es mir schon angesehen. Es ist aber eben nicht VB.
Übrigens, wenn picoC durch ist, kümmere ich mich auch nochmal um die Telemetrie. Ich denke ein Freiprogrammierbares Overlay zur Statuszeile wäre cool. Damit könnte man eigene Sachen anzeigen.
Für picoC werde ich wohl noch die manualcontrol erweitern. Ein eigener Filghtmode "Programm(ed)" o.ä. könnte dazu verwendet werden um z.B. eine Sonarhöhenregelung oder Abstandsregelung einzubauen. Mein Traum wäre ja einen Copter ohne anzuecken in 1m Höhe durch einen Kiefernwald selbstständig! fliegen zu lassen. Sollte eigentlich mit picoC kein Problem sein.
vg ernieift
 

Flensburger

Erfahrener Benutzer
Hallo,
ich wollte mich zurückmelden, das Schlafzimmer ist renoviert.

Dadurch bin ich nicht mehr zum PicoC Testen gekommen. Ich sehe, Carsten ist da ein ganzes Stück weiter. Jetzt muss ich erst mal auf den neuesten Stand kommen.
 
FPV1

Banggood

Oben Unten