Quadrocopter ULC Telemetrie

Kleine Projektvorstellung.
Ich bin seit 2 Monaten begeisterter Quadrocopterflieger. Jetzt ist mir bei der Flasherei einer der 4 SpeedController eine Augangsseite kaputt gegangen. (hatte ja noch 2 Reserve)
Mir war es schon ein Dorn im Auge das man den Buzzer am Copter für Low Bat ab 50m nicht meht richtig hört, wenn noch ein bisschen Wind dazu kommt ist es vorbei.
Also baue ich mir eine Ultra Low Cost Telemtrie brücke vom Copter zur Funke.
(und ja es gibt auch Funksystm mit integrierter Telemetrie, aber wenn man Einsteigt hat man halt nicht immer das Budget für von allem das Feinste).
Ich hatte sowieso noch dieses Set hier da:
http://www.ebay.de/itm/Sendemodul-Sender-Sendeeinheit-433Mhz-Funk-Modul-Funkschalter-Funkmodul-hp-/161172973476?pt=Wissenschaftliche_Geräte&hash=item2586a867a4
habe ich vor nem Jahr 5Paar für 4,95 incl Versand aus HK.

Damit habe ich mir dann die Funkstrecke gebaut.

Bild 1
Im Internet habe ich dann die Schaltung des ESC rausgesucht ist hier das ist ein Typ mit N-Fet Ausgangs Sixpack. Als Controller arbeitet darauf ein Atmega8A mit exterenen 16MHz Resonator (perfekt für Arduino zu nutzen TYP:Adruino NG or older w/ Atmega8)


Bild 2
Das Dingen gestript und die defekten Ausgangsfets rausgeschmießen. Die Belegung rausgesucht so das am orginalen Servosignal-Eingang ich den Sender anschließen kann. An diesem ESC sind die ISP Pads auf die Seite rausgeführt also Problemlos mit dem mySmartUSBlight geflasht.


Bild 3
Der Empfänger ein Arduino Nano Clone mit dem Empfänger und einem kleinen 2*8 Display aus meiner Schublade das ich mit dem pcf8574 via I2C angebunden habe.
An den Empfänger kommt jetzt noch ein Vibrationsmotor und ein Buzzer damit ich an der Funke auch die schwächer werden Akkus mitbekomme.
Noch nicht implenmentiert sind der Buzzer und Vibramotor. Ausserdem fehlt noch eine Überwachung ob Daten kommen bzw nicht kommen.

Der Code kommt im nächsten Posting

Im Moment "überwache" ich die Netzteil Spannug.
Der Empfänger kommt in ein kleines Gehäuse an der Funke und der Sender bekommt Durchschleifstecker. evtl kommt später noch eine Stromanzeige dazu.

Gruß
DerDani

Der Sendercode

/
#define BATTPIN A2
#define DATAPIN 2

#include <VirtualWire.h>



unsigned long lmillis=0;
int pause=2000;
byte buf[2];
int battwert=0;

void setup()
{
  pinMode(BATTPIN,INPUT);
  pinMode(0,INPUT);  // Initialise the IO and ISR
  vw_set_tx_pin(DATAPIN);
  vw_set_ptt_inverted(false); // Required for DR3100
  vw_setup(2000);	 // Bits per sec
}

void loop(){
  unsigned long actmillis=millis();
  if (actmillis-lmillis>=pause){
    battwert=analogRead(BATTPIN);
    buf[0]=lowByte(battwert);
    buf[1]=highByte(battwert);
    vw_send(buf,2);
    vw_wait_tx(); // Wait until the whole message is gone
    lmillis=actmillis;
  }
}

Der Empfänger

/* copterrec.pde
 It recieve a 2 Bytes form Copter about Bat state to display it
 on an I2C 8*2 Display with an beep sound to make cheap telemetry
 */

#include <VirtualWire.h>
#include <LiquidCrystal_I2C.h>
#include <Wire.h> 


LiquidCrystal_I2C lcd(0x20,8,2);  // set the LCD address to 0x20 for a 16 chars and 2 line display

int ticker=0;
float volt=0.0;
int voltinteger=0;
byte voltganz=0;
byte volttenth=0;
uint8_t buf[1];   
uint8_t buflen = 2;
boolean pinstate=false;

void setup()
{
  //  Serial.begin(9600);	// Debugging only
  //  Serial.println("setup");
  // Initialise the IO and ISR
  vw_set_ptt_inverted(false); // Required for DR3100
  vw_setup(2000);	 // Bits per sec
  vw_rx_start();       // Start the receiver PLL running
  lcd.init();

}

void loop()
{
  if (vw_get_message(buf, &buflen)) // Non-blocking
  {
    ticker=(buf[1]<<8)|(buf[0]);
    digitalWrite(13,HIGH);
  }
  volt=ticker*0.26;
  voltinteger=volt;
  volttenth=voltinteger%10;
  voltganz=(voltinteger-volttenth)/10;
  lcd.setCursor(0,0);
  lcd.print("Batt-V:");
  lcd.setCursor(4,1);
  if (voltganz<10){
     lcd.print(" ");
     lcd.setCursor(5,1);
  }
  lcd.print(voltganz);
  lcd.print(".");
  lcd.print(volttenth);
digitalWrite(13,LOW);
}

Gruß
DerDani

Der Empfänger hat jetzt einen Daten Timout
Beide haben eine Watchdog bekommen.

Empfänger

/* copterrec.pde
 It recieve a 2 Bytes form Copter about Bat state to display it
 on an I2C 8*2 Display with an beep sound to make cheap telemetry
 */

#include <VirtualWire.h>
#include <LiquidCrystal_I2C.h>
#include <Wire.h> 
#include <avr/wdt.h>


LiquidCrystal_I2C lcd(0x20,8,2);  // set the LCD address to 0x20 for a 16 chars and 2 line display

int ticker=0;
int voltinteger=0;
byte voltganz=0;
byte volttenth=0;
unsigned long lmillis=0;
int timeout=2000;
boolean daten=false;


void setup()
{
  vw_set_ptt_inverted(false); // Required for DR3100
  vw_setup(2000);	 // Bits per sec
  vw_rx_start();       // Start the receiver PLL running
  lcd.init();
  wdt_enable(WDTO_500MS);
}

void loop()
{
  uint8_t buf[1];   
  uint8_t buflen = 2;
  if (vw_get_message(buf, &buflen)) // Non-blocking
  {
    ticker=(buf[1]<<8)|(buf[0]);
    digitalWrite(13,HIGH);
    lmillis=millis();
    daten=true;
  }
  if(millis()-lmillis>timeout){
    printTimeout();
  }
  if(daten==true){
    printVolt();
    daten=false;  
  }
  digitalWrite(13,LOW);
  wdt_reset();
}

void printTimeout(){
  lcd.clear();
  lcd.setCursor(0,0);
  lcd.print("KEINE");
  lcd.setCursor(3,1);
  lcd.print("DATEN");

}

void printVolt(){
  voltinteger=ticker*0.26;
  volttenth=voltinteger%10;
  voltganz=(voltinteger-volttenth)/10;
  lcd.clear();
  lcd.setCursor(0,0);
  lcd.print("Batt-V:");
  lcd.setCursor(4,1);
  if (voltganz<10){
    lcd.print(" ");
    lcd.setCursor(5,1);
  }
  lcd.print(voltganz);
  lcd.print(".");
  lcd.print(volttenth);
}

Gruß
Der Dani