TauLabs/PicoC: Ansteuerung RGB LEDs WS2812

cGiesen

Erfahrener Benutzer
Ich habe gerade mal den Tiny entfernt und laufen lassen.
Gleiche Fehlermeldung.
Also keine Kommunikation mit dem Tiny würde ich sagen.

Ich dreh hohl, ich habe alles 1000 mal geprüft, was mache ich da denn zum verecken falsch....

Edit:
Kaum habe ich das geschrieben, nehme ich das Board in die Hand, springt mich der Fehler an....

KOPF AUF DEN TISCH SCHLAG
 

ernieift

Erfahrener Benutzer
War gestern zu spät für mich. Hätte mich auch gewundert, wenn das nicht gehen sollte. Nur der Kondensator ist wichtig. Sonst geht es bei mir auch nicht. Du kannst zum probieren sogar den Programmer dran lassen und noch das Quanton anschließen.
 

cGiesen

Erfahrener Benutzer
Es fehlte nur eine Brücke um den Steck in der Mitte des Steckboards zu überbrücken.
Jetzt sieht man auch an den LEDs, dass sich was tut.

Jetzt ist zwar der Progger unterwegs, ab die 7€ verkrafte ich schon.

Heute Abend bin ich 'leider' mit meinem Freund zum Essen verabredet, da kann ich nicht testen, aber vielleicht mache ich eher Frei.


-----
Was in eigener Sache, wenn einer im Raum Bochung jemanden kennt, der einen
Anwendungsprogrammierer Schwerpunkt CRM & ERP (Visual Studio)
sucht, wäre ich für einen Hinweis dankbar.
-----
 

cGiesen

Erfahrener Benutzer
Ich habe überlegt, ob man eine Einschaltmeldung coded, welches einfach irgendeine Sequenz ausgibt oder einfach nur eine LED schaltet. So hätte man ein Test, dass nur die RGBLED Hardware funktioniert.
Wann danach dann nichts kommt, liegt es an der Kommunikation mit der FC
 

ernieift

Erfahrener Benutzer
Und Arduino ist dafür ja recht gut geeignet. Mit den tinys kann man wohl auch noch viel mehr machen und als smd verschwinden die bei Bedarf in einem Kabel.
 

cGiesen

Erfahrener Benutzer
Hallo Jens,

ich brauche mal Hilfe um mich in die Logik einzufinden
Code:
#include "system.h"

/* WS2812 library */
#define nLED 3
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 */


short LEDupdate=1;
short TMParmed=2;
short r=0,g=0,b=0;


TestValSet(1);
while(TestValGet() > 0)
{
	if (armed() && (TMParmed != 1))
	{	
		setLED(0,170,0,0);
		setLED(2,170,0,0);
		TMParmed = 1;
		LEDupdate=1;
 	} 
	else if (!armed() && (TMParmed != 0))
	{
		setLED(0,0,170,0);
		setLED(2,0,170,0);
		TMParmed = 0;
		LEDupdate=1;
	}


	setLED(1,170,0,0);
	if (LEDupdate == 1) {
		sendLED();
		LEDupdate = 0;
	}


	delay(500);
}
TestValSet(2);
Ich setze TestVal zum Start auf 1, das sehe ich auch. Die while soll laufen solange TestVal > 0 ist.
Das klappt auch.
Wenn ich jetzt TestVal auf 0 setze, müsste die Schleife doch unterbrochen werden und TestVal auf 2 gesetzt werden, damit man sieht, dass das geklappt hat.
Das passiert aber nicht.
WARUM wo ist mein Fehler?
 

ernieift

Erfahrener Benutzer
Der Wert vom Eingabefeld wird derzeit nur bei 'StartScript' zur FC übertragen. Sicher lässt sich noch ein Updatebutton neben dem Feld dafür einfügen.

OT:
Ich habe heute mal angefangen zwei sensorlose Quantons zu bauen. Ging ganz gut, kostet aber schon Zeit. Der Hintergrund dafür ist ein Taulabs basierendes OSD zu bauen, dass aber nicht fliegt, sondern die Daten aus einem beliebigen Telemetrielink bekommt und wie bei meinem HoTT-OSD am Boden ins Video mischt. Das Quanton habe ich genommen, weil es Flash (für picoC) und Servos Outputs hat. Ausserdem sind genug UARTS zum kommunizieren dran (2 fallen weg und gehen fürs OSD als SPI drauf). Der Vorteil der ganzen Geschichte ist, dass man es über die GCS parametrieren könnte und alle möglichen Module schon verwenden kann. Nur fliegen kann es eben nicht.
Den Code kann man dann vielleicht trotzdem in 'flight' weiterpflegen. Das Teil könnte man dann auch als Antennentracker missbrauchen. Mit eigenem GPS sogar als mobile Basis. Oder man nimmt es einfach als picoC Plattform für irgendwas anderes (Türklingel,...).
Die Idee ist mir vor ein paar Tagen gekommen. Mal sehen wo der Winter hingeht...
 

cGiesen

Erfahrener Benutzer
Hallo Jens,

kannst Du bitte mal einen Blick hierdrauf werfen:
Code:
/** *****************************************************************************
 * @file       NeoPixel_Transceiver.ino
 * @author     ernieift, Copyright (C) 2014
 * @brief      protocol converter to use rgb led stripes at async serial ports
 * @see        The GNU Public License (GPL) Version 3
 *
 *****************************************************************************/
/*
 * This program is free software; you can redistribute it and/or modify
 * it under the terms of the GNU General Public License as published by
 * the Free Software Foundation; either version 3 of the License, or
 * (at your option) any later version.
 *
 * This program is distributed in the hope that it will be useful, but
 * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
 * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
 * for more details.
 *
 * You should have received a copy of the GNU General Public License along
 * with this program; if not, write to the Free Software Foundation, Inc.,
 * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
 */


/* pinout used on ATtiny85
 * pin 1 -
 * pin 2 RX comes from host
 * pin 3 TX (not used at yet)
 * pin 4 GND
 * pin 5 DOUT goes to LED stripe
 * pin 6 -
 * pin 7 -
 * pin 8 VCC
 */


#include <SoftwareSerial.h>
#include <Adafruit_NeoPixel.h>


/* global definition */
#define TIMEMAX 3


/* Serial definition */
#define RXPIN 3
#define TXPIN 4
#define BAUDRATE 9600
SoftwareSerial softSerial(RXPIN, TXPIN);


/* LED definition */
// Parameter 1 = number of pixels in strip
// Parameter 2 = Arduino pin number (most are valid)
// Parameter 3 = pixel type flags, add together as needed:
//   NEO_KHZ800  800 KHz bitstream (most NeoPixel products w/WS2812 LEDs)
//   NEO_KHZ400  400 KHz (classic 'v1' (not v2) FLORA pixels, WS2811 drivers)
//   NEO_GRB     Pixels are wired for GRB bitstream (most NeoPixel products)
//   NEO_RGB     Pixels are wired for RGB bitstream (v1 FLORA pixels, not v2)
#define LEDPIN 0
#define LEDMAX 100
Adafruit_NeoPixel strip = Adafruit_NeoPixel(LEDMAX, LEDPIN, NEO_GRB + NEO_KHZ800);


void setup() {
  strip.begin();
  strip.show(); // Initialize all pixels to 'off'
  softSerial.begin(BAUDRATE);
}


void loop() {
  enum machinestates {
    STATE_IDLE=0,
    STATE_RECEIVE_R=1,
    STATE_RECEIVE_G=2,
    STATE_RECEIVE_B=3,
    STATE_SEND=4,
    STATE_NOSERIAL=5
  };


  uint8_t oldState, newState;
  uint8_t timeout;
  uint16_t n;
  uint8_t r,g,b;
  r=128;
  g=128;
  b=0;
  oldState = STATE_NOSERIAL;
  newState = STATE_NOSERIAL;
  timeout = 0;


  while (1) {
    switch (oldState) {
      case STATE_NOSERIAL:
        if (softSerial.available()) {
          n = 0;
          newState = STATE_RECEIVE_R;
        } else {
          r=r+1;
          g=g-1;
          strip.setPixelColor(0, r, g, b);
          if (r = 255) r=0;
          if (g = 0) g=255;
          strip.show();
          delay(1000);
        }
        break;
      case STATE_IDLE:
        if (softSerial.available()) {
          n = 0;
          newState = STATE_RECEIVE_R;
        }
        break;
      case STATE_RECEIVE_R:
        if (softSerial.available()) {
          r = softSerial.read();
          newState = STATE_RECEIVE_G;
        }
        break;
      case STATE_RECEIVE_G:
        if (softSerial.available()) {
          g = softSerial.read();
          newState = STATE_RECEIVE_B;
        }
        break;
      case STATE_RECEIVE_B:
        if (softSerial.available()) {
          b = softSerial.read();
          strip.setPixelColor(n, r, g, b);
          newState = (++n < LEDMAX) ? STATE_RECEIVE_R : STATE_SEND;
        }
        break;
      case STATE_SEND:
        strip.show();
        delay(1);
        newState = STATE_IDLE;
        break;
      default:
        newState = STATE_IDLE;
    }


    if ((newState != oldState) || (oldState == STATE_IDLE)) {
      timeout = 0;
    }
    else if (timeout >= TIMEMAX) {
      newState = STATE_SEND;
    }
    else {
      delay(1);
      timeout++;
    }


    oldState = newState;
  }
}
ich belege r und g mit 128 vor (entspricht gelb)
Jetzt erwarte ich eigentlich, das jede Sekunde r einen hochgezählt wird g eines runter.
Die Farbe müsste sich also ganz langsam verändert.

In Realität wird es von gelb aber nach 1 Sekunde grün.

Und ja, ich habe es auch mit r++ und g-- versucht.

Hast Du eine Idee was ich da falsche mache?

Edit ist im Kern Dein Code, ich habe nur STATE_NOSERIAL und den entsprechenden Case hinzugefügt
 

ernieift

Erfahrener Benutzer
Deine if-bedigungen sind immer true (== statt =). Ansonsten würde ich die Warteschleife aus dem zustandsautomaten rausnehmen und vor die endlos-while-Schleife setzen.
 
FPV1

Banggood

Oben Unten