Thread Tools
Jun 09, 2014, 01:27 PM
Registered User
hi again, Patolin

As i told it before i use "rctx_0_7" soft (lcd 16 x 2).
On the test circuit i use all the parts including the lcd.
But in the final circuit i don t wanted to use it, is ok to connect A0 to vcc?
And the fields like "guardar" what means?
Sign up now
to remove ads between posts
Jun 09, 2014, 05:36 PM
Registered User
Thread OP
Quote:
Originally Posted by emil21
hi again, Patolin

As i told it before i use "rctx_0_7" soft (lcd 16 x 2).
On the test circuit i use all the parts including the lcd.
But in the final circuit i don t wanted to use it, is ok to connect A0 to vcc?
And the fields like "guardar" what means?
If you remove the LCD you can connect A0 to Vcc, and the keyboard and menus get dissabled.

Also "Guardar" = "Save". It saves the actual settings into the actual model record.
Jun 10, 2014, 02:06 AM
Registered User
Quote:
Originally Posted by patolin
If you remove the LCD you can connect A0 to Vcc, and the keyboard and menus get dissabled.

Also "Guardar" = "Save". It saves the actual settings into the actual model record.
aaaa..ok
Thank you
Jun 19, 2014, 12:09 PM
Registered User
this is my mod with oled display adafruit connected via i2c, nice because you have a lot More input Pins free, the upper right is a pot ch5 the middle is a rotary enc that i try to get working upper left is TC switch, sry couldnt get a sharp Video with my mobile so made pics

i dont use it at the moment because i must find a solution to trim at least the center position, and im not very good at arduino code

here is my current code

Code:
#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#include <EEPROM.h>
#define OLED_RESET 6
Adafruit_SSD1306 display(OLED_RESET);

// config PPM
#define servoCentro 1500       //servo center value (us)
#define ppmLong 22500          //ppm frame
#define ppmPulso 300           //ppm pulse width
#define onState 0              //Polarity: 0 neg / 1 pos
#define sigPin 9               //ppm output pin
#define ppmMin 1000
#define ppmMax 2000

// config TX
#define CANALES 5              //number of channels
#define MODELOS 5              //total model memory
#define canalTh 2              //Throtle channel ID
#define potMin 0               //Pot min value
#define potMax 1023            //Por max value
#define txVer "ArduTX v1.1"
#define numBytesPorModelo 32
#define swTC 5
#define swDR 11


int ppm[CANALES];              //ppm output array
unsigned char sw_status=0x00;  //0:TC 1:DR 
unsigned int pots[CANALES];    //ADC data array
unsigned char inPots[CANALES] = {A1, A0, A2, A3, A6};    //Input pins array
unsigned char batPin = A7;
// nothing editable from here :)
// *****************************
unsigned char menuActual=0;
unsigned char menuSubActual=0;
unsigned char submenuActual=0;
unsigned char drSeleccion=0xFF;
unsigned char pantalla=0;
unsigned char menu=0;
unsigned char modeloActual=0;
unsigned char servoReversa;
unsigned char dual_rate_low[CANALES];
unsigned char dual_rate_hi[CANALES];
boolean displayReady=false;
int temporal=0;
int calibracion[CANALES][2];
char msgs[][19] = {
  "Main Menu",
  "Servo Direction", 
  "Dual Rates", 
  "Model Selection", 
  "Save data", 
  "Stick Calibration"
};

// timer1 setup
void configTimer1() {
  cli();
  TCCR1A = 0;
  TCCR1B = 0;
  OCR1A = 100;
  TCCR1B |= (1 << WGM12);
  TCCR1B |= (1 << CS11);  // prescaler 8: 0.5us - 16mhz
  TIMSK1 |= (1 << OCIE1A);
  sei();  
}

// Interrupcion del timer
ISR(TIMER1_COMPA_vect){  
  static boolean state = true;
  TCNT1 = 0;
  if(state) {   
    digitalWrite(sigPin, onState);
    OCR1A = ppmPulso * 2;
    state = false;
  }
  else{   
    static byte cur_chan_numb;
    static unsigned int calc_rest;
    digitalWrite(sigPin, !onState);
    state = true;
    if(cur_chan_numb >= CANALES){
      cur_chan_numb = 0;
      calc_rest = calc_rest + ppmPulso; 
      OCR1A = (ppmLong - calc_rest) * 2;
      calc_rest = 0;
    }
    else{
      OCR1A = (ppm[cur_chan_numb] - ppmPulso) * 2;
      calc_rest = calc_rest + ppm[cur_chan_numb];
      cur_chan_numb++;
    }     
  }
}

void setup() {
  unsigned char i;
  // switches setuo
  pinMode(swTC, INPUT_PULLUP);
  pinMode(swDR, INPUT_PULLUP);
  digitalWrite(swTC, HIGH); // pullup
  digitalWrite(swDR, HIGH); // pullup
  pinMode(2, INPUT_PULLUP);
  pinMode(3, INPUT_PULLUP);
  pinMode(4, INPUT_PULLUP);
  digitalWrite(2, HIGH); // pullup
  digitalWrite(3, HIGH); // pullup
  digitalWrite(4, HIGH); // pullup
  
  // zero state values for ppm
  ppm[0]=servoCentro;
  ppm[1]=servoCentro;
  ppm[2]=ppmMin;
  ppm[3]=servoCentro;
  ppm[4]=servoCentro;
  ppm[5]=servoCentro;

  //zero state config parameters

  // servo reverse: 0 normal, 1 reverse
  servoReversa=0b00000000;

  // dual rates por defecto
  for (i=0;i<=CANALES;i++) {
    dual_rate_low[i]=75;
    dual_rate_hi[i]=100;
  }

  // load data from eeprom
  //reseteaEeprom();
  modeloActual=cargaDatosEeprom(255);

 // LCD config
  display.begin(SSD1306_SWITCHCAPVCC, 0x3D);
  display.clearDisplay();
  display.setTextSize(1);
  display.setTextColor(WHITE);
  display.setCursor(0,0);
  display.print(txVer);
  display.setCursor(0,7);  
  display.print("(c) 2014");
  display.display();
  delay(2000);
  // ppm timer config
  pinMode(sigPin, OUTPUT);
  digitalWrite(sigPin, !onState);
  configTimer1();
}

void loop() {
  int i;
  int j=0;
  unsigned char tecla=0;
  int vBat;
  unsigned char valT;
  while(1) {
    vBat=analogRead(batPin);
    // read potentiometers
    readPots();
    readSwitches();
    
    // read keyboard value every 10th loop and store it
    // and set the values depending on the menu option
    displayReady=false;
    display.clearDisplay();
  if (pantalla==0) {
      // info screen
      unsigned char valBar;  
      display.setCursor(2,0);
      display.print("M: ");
    display.setCursor(30,0);
    display.print(modeloActual+1); 
      // throtle cut switch value
             // throtle cut
          if (bitRead(sw_status,0)==0) {
            display.setCursor(2, 57);
            display.print("TC");
          } else {
            display.setCursor(2, 57);
            display.print("  ");
          }
          // dual rates
          if (bitRead(sw_status,1)==0) {
             display.setCursor(45, 57);
            display.print("Rate: LO");
          } else {
             display.setCursor(45, 57);
             display.print("Rate: HI");
          }
      // batery Voltage
      display.setCursor(75, 0);
      display.print("Bat: ");  
      int voltajeBat=map(vBat,0,1023,0,100);
      display.setCursor(98, 0);
      display.print(voltajeBat);
      display.setCursor(120, 0);
      display.print("%");
    
          
      // draw the bars
      display.drawLine(64,9,64,42, WHITE);
      for (i=0;i<=4;i++) {
        // level bars
        valBar=pots[i]/11,5;
        display.drawRect(15,9+(i*8),98,3, WHITE);
        display.drawPixel(16+valBar,10+(i*8), WHITE);
        display.drawPixel(15+valBar,10+(i*8), WHITE);
        display.drawPixel(17+valBar,10+(i*8), WHITE);
        // servo reverse indicator
        if (bitRead(servoReversa, i)) {
          display.setCursor(8, 8+(i*8));
          display.print("R"); 
        } else {
          display.setCursor(8, 8+(i*8));
          display.print("N");      
        }
      }
    } 
    else {
      if (pantalla==1) {
         // main menu
         display.setCursor(0, 0);
         display.print(msgs[0]);
          for (i=1;i<=5;i++) {
              if (i==menuSubActual) {
              display.setCursor( 0, i*9);
              display.print("->");
              display.setCursor( 10, i*9);
              display.print(msgs[i]);
              } else {
              display.setCursor( 0, i*9);
              display.print("  ");
              display.setCursor( 10, i*9);
              display.print(msgs[i]);
              }
          }
      }

      if (pantalla==2) {
        if ( menuActual==1) {
          // servo reversing
          display.setCursor( 0, 0);
          display.print(msgs[menuActual]);
          for (i=0;i<=(CANALES-1);i++) {
            if (i==menuSubActual) {
              display.setCursor( 0, 8+i*8);
              display.print("->");                   
            } 
            else {
              display.setCursor( 0, 8+i*8);
              display.print("  ");                
            }
              display.setCursor( 10, 8+i*8);
            display.print("CH: ");
              display.setCursor( 22, 8+i*8);
            display.print(String(i+1));
            if (bitRead(servoReversa,i)) {
              display.setCursor( 26, 8+i*8);
              display.print(" - R");
            } 
            else {
              display.setCursor(  26, 8+i*8);
              display.print(" - N");
            }
          }
              display.setCursor( 55, 42);
          display.print("Mod: ");  
              display.setCursor( 75, 42);
          display.print(String(modeloActual+1));
        }

        if(menuActual==2) {
          // dual rates
          unsigned char contadorTemp=0;
          display.setCursor(0,0);
             display.print(msgs[menuActual]);
          for (i=0;i<=(CANALES-1);i++) {
            display.setCursor(0, 8+i*8);
            display.print("CH: ");
            display.setCursor(18, 8+i*8);
            display.print(String(i+1));
            if (menuSubActual==contadorTemp) {
              if (drSeleccion==contadorTemp) {
                display.setCursor(26, 8+i*8);
                   display.print("*");     
                 } 
              else {
                  display.setCursor(26, 8+i*8);
                   display.print(">");
              }
            }
          display.setCursor(30, 8+i*8);
               display.print("L:" ); 
               display.setCursor(42, 8+i*8);
               display.print(String(dual_rate_low[i]));
               contadorTemp++;               
               if (menuSubActual==contadorTemp) {
                 if (drSeleccion==contadorTemp) {
                 display.setCursor( 55, 8+i*8);
                   display.print("*");  
                 } else {
                   display.setCursor( 55, 8+i*8);
                   display.print(">");
                 }
               }
               display.setCursor(  60, 8+i*8);
               display.print("H:");
               display.setCursor(  70, 8+i*8);
               display.print(String(dual_rate_hi[i]));
               contadorTemp++;
          }
        }

        if (menuActual==3) {
          // model selection
           display.setCursor(  0, 0);
             display.print(msgs[menuActual]);
          for (i=0;i<=(MODELOS-1);i++) {
           display.setCursor(  8, 8+i*8);
                 display.print("Mod: ");
                 display.setCursor(  27, 8+i*8);
                 display.print(String(i+1) );
                 if (i==menuSubActual) {
                   display.setCursor(0, 8+i*8);
                    display.print("->" );                   
                 } else {
                   display.setCursor( 0, 8+i*8);
                    display.print("  ");                
                 }
                 
                 if (i==modeloActual) {
                   display.setCursor(35, 8+i*8);
                    display.print("*");
                 }
             }
          }
          
          
        if (menuActual==4) {
          // data save
          int eepromBase;
          eepromBase=numBytesPorModelo*modeloActual;
          unsigned char eepromPos =eepromBase;
          // actual model
          EEPROM.write(511,modeloActual);
          // servo reverse
          EEPROM.write(eepromPos, servoReversa);
          eepromPos++;
          // dual rates
          for (i=0;i<=CANALES;i++) {
            EEPROM.write(eepromPos, dual_rate_low[i]);
            eepromPos++;
            EEPROM.write(eepromPos, dual_rate_hi[i]);
            eepromPos++;
          }

          display.setCursor(  0, 20);
             display.print("Saving data for");
          display.setCursor(  0, 28);
             display.print("actual model:");
          display.setCursor(  0, 40);
             display.print(String(modeloActual+1));
          display.setCursor(  0, 42);
             display.print("...wait");
          pantalla--;
          menuActual=1;
          menuSubActual=1;
             display.display();
          delay(1000);
        }

        if (menuActual==5) {
          // gimbal calibration
          display.setCursor(  0, 0);
          display.print(msgs[menuActual]);
          display.display();
          delay(500);
          display.clearDisplay();
          for (i=0;i<=CANALES;i++) {
            calibracion[i][0]=512;
            calibracion[i][1]=512;
          }
          tecla=readKeys(); 
          while (tecla!=1) {
          display.clearDisplay();
          display.setCursor(  0, 0);
            display.print("Calibration");
            display.setCursor(  0, 8);
            display.print("Move the sitcks");
            display.setCursor(  0, 16);
            display.print("1: ");
            display.setCursor(20, 16);
            display.print(String(analogRead(inPots[0])));
            display.setCursor(  40, 16);
            display.print("2: ");
            display.setCursor(  60, 16);
            display.print(String(analogRead(inPots[1])));
            display.setCursor(  0, 24);
            display.print("3: ");
            display.setCursor(  20, 24);
            display.print(String(analogRead(inPots[2])));
            display.setCursor(  40, 24);
            display.print("4: ");
            display.setCursor(  60, 24);
            display.print(String(analogRead(inPots[3])));
            display.setCursor( 0, 32);
            display.print("5: ");
            display.setCursor( 20, 32);
            display.print(String(analogRead(inPots[4])));
            display.setCursor(   40, 32);
            display.print("6: ");
            display.setCursor(  60, 32);
            display.print(String(analogRead(inPots[5])));
          display.display();
            int lecturaTemporal;
            for (i=0;i<=(CANALES-1);i++) {
              lecturaTemporal=analogRead(inPots[i]);
              // min values
              if (lecturaTemporal<=calibracion[i][0]) {
                calibracion[i][0]=lecturaTemporal;
              }
              // max values
              if (lecturaTemporal>=calibracion[i][1]) {
                calibracion[i][1]=lecturaTemporal;
              }
              delay(10);
            }
            tecla=readKeys();
          }
          // save calibration data
          int posEeprom=0;
          for (i=0;i<=(CANALES-1);i++) {
            posEeprom=400+(i*4);
            EEPROMWriteInt(posEeprom, calibracion[i][0]); //min
            posEeprom+=2;
            EEPROMWriteInt(posEeprom, calibracion[i][1]); //max
          }
          display.clearDisplay();
          display.setCursor(  0, 20);
          display.print("Saving calibration");
          display.setCursor(  0, 28);
          display.print("data");
          display.setCursor(   0, 40);
          display.print("...wait");
          display.display();
          delay(1000);
          pantalla=0;
          menuActual=0;
          menuSubActual=0;
        }
      }

    }

    // screen update
    display.display();


    // read keyboard every 2 loops
    if (j>2) {
      tecla=readKeys(); 
      if (tecla==2) {
        if (pantalla<2) { 
          pantalla++; 
          menuActual=menuSubActual; 
          menuSubActual=0;
        } 
        else {
          // options for each menu
          if (menuActual==1) {
            // reversa de servos
            bitWrite(servoReversa, menuSubActual, !bitRead(servoReversa,menuSubActual));
          }
          if (menuActual==2) {
            // dual rates
            if (drSeleccion!=0xFF) {
              drSeleccion=0xFF;
            } 
            else {
              drSeleccion=menuSubActual;
            }
          }

          if (menuActual==3) {
            // model selection
            modeloActual=menuSubActual;
            // load data from eeprom
            EEPROM.write(511, modeloActual);
            cargaDatosEeprom(modeloActual);
            pantalla=0; 
            menuSubActual=0; 
            menuActual=0;
          }
        }
      }

      if (tecla==3) {
        switch (menuActual) {
        case 2:
          if (drSeleccion==0xFF) {
            if (menuSubActual<(CANALES*2)) { 
              menuSubActual++; 
              if (pantalla==0) {
                pantalla++; 
              }
            }
          } 
          else {
            if ((drSeleccion%2)==0) {
              if (dual_rate_low[drSeleccion/2]>0) { 
                dual_rate_low[drSeleccion/2]--;  
              }    
            } 
            else {
              if (dual_rate_hi[drSeleccion/2]>0) { 
                dual_rate_hi[drSeleccion/2]--;  
              } 
            }
          }
          break;
        default: 
          if (menuSubActual<6) { 
            menuSubActual++; 
            if (pantalla==0) {
              pantalla++; 
            }
          }
          break;
        }   

      }

      if (tecla==1) {
        switch (menuActual) {
        case 2:
          if (drSeleccion==0xFF) {
            if (menuSubActual==0) { 
              pantalla--; 
              menuSubActual=1; 
              menuActual=0;
            } 
            else { 
              menuSubActual--; 
            } 
          } 
          else {
            if ((drSeleccion%2)==0) {
              if (dual_rate_low[drSeleccion/2]<100) { 
                dual_rate_low[drSeleccion/2]++;  
              }
            } 
            else {
              if (dual_rate_hi[drSeleccion/2]<100) { 
                dual_rate_hi[drSeleccion/2]++;  
              } 
            }
          }
          break;
        default:
          if (menuSubActual>0) {
            menuSubActual--; 
          } 
          else {
            if (pantalla>0) { 
              pantalla--; 
              menuSubActual=1; 
              menuActual=0;
            }
          } 
          break;
        }
      }

      j=0;
    }
    j++;

  }
}

void readPots() {
  unsigned char i,j;
  int temporalPots[CANALES];
  for (i=0;i<=(CANALES-1);i++) {
    // read the pots     
    temporalPots[i]=analogRead(inPots[i]);
    // calibration mapping
    pots[i]=map(temporalPots[i],calibracion[i][0], calibracion[i][1], 0, 1023);
    // servo reversing
    if (bitRead(servoReversa,i)==1) {
      pots[i]=1023-pots[i]; 
    }

    // Throtle cut
    if (i==canalTh && bitRead(sw_status,0)==0) {
      // TC activado
      pots[i]=0;
    }

    // dual rates
    if (bitRead(sw_status,1)==0) {
      // low, rates
      pots[i]=ajusteDR(pots[i],dual_rate_low[i],i,canalTh);
    } 
    else {
      // hi rates 
      pots[i]=ajusteDR(pots[i],dual_rate_hi[i],i,canalTh);
    }  
    // map values to PPM
    ppm[i]=map(pots[i],potMin, potMax, ppmMin, ppmMax);
  }
}

void readSwitches() {
  // read switches and set into the sw_status var
  if (digitalRead(swTC)==HIGH) {
    bitWrite(sw_status,0,1);
  } 
  else {
    bitWrite(sw_status,0,0);
  }
  if (digitalRead(swDR)==HIGH) {
    bitWrite(sw_status,1,1);
  } 
  else {
    bitWrite(sw_status,1,0);
  }
}

unsigned char readKeys() {
  unsigned char salida;  
  salida = 0;
  if (digitalRead(4)==0) salida=3;
  if (digitalRead(2)==0) salida=2;
  if (digitalRead(3)==0) salida=1;
  // read analog keyboard
  delay(25);
  return salida;
}

int  freeRam () {
  // returns free ram in avr chip
  extern int __heap_start, *__brkval; 
  int v; 
  return (int) &v - (__brkval == 0 ? (int) &__heap_start : (int) __brkval); 
}

unsigned char cargaDatosEeprom(unsigned char mod) {
  // load data from eeprom, for selected model
  int eepromBase;
  unsigned char i;
  if (mod=255) {
    mod=EEPROM.read(511);
  } 

  eepromBase=numBytesPorModelo*mod;
  unsigned char eepromPos=eepromBase;
  // servo reversing
  servoReversa=EEPROM.read(eepromPos);
  eepromPos++;
  // dual rates
  for (i=0;i<=CANALES-1;i++) {
    dual_rate_low[i]=EEPROM.read(eepromPos);
    eepromPos++;
    dual_rate_hi[i]=EEPROM.read(eepromPos);
    eepromPos++;
  }
  int posEeprom;
  for (i=0;i<=(CANALES-1);i++) {
    posEeprom=400+(i*4);
    calibracion[i][0]=EEPROMReadInt(posEeprom); //minimo
    posEeprom+=2;
    calibracion[i][1]=EEPROMReadInt(posEeprom); //maximo
  }

  return mod;
}

unsigned char reseteaEeprom() {
  // erases eeprom, just for checking values (unused now)
  int eepromBase, eepromPos;
  unsigned char i,j;
  EEPROM.write(511,0);
  for (j=0;j<=CANALES-1;j++) {
    eepromPos=numBytesPorModelo*j;
    EEPROM.write(eepromPos,0x00);
    eepromPos++;
    for (i=0;i<=CANALES-1;i++) {
      EEPROM.write(eepromPos,75);
      eepromPos++;
      EEPROM.write(eepromPos,100);
      eepromPos++;

    }
  }      
}


int ajusteDR(int valor, float dr, unsigned char canal, unsigned char canTh) {
  // dual rate calc
  int salida,temp;
  float mult;
  mult=dr;
  if (canal==canalTh) {
    salida=(int)valor*mult/100;  
  } 
  else {
    temp=valor-512;
    salida=(int)((temp*mult/100)+512);

  }
  salida=constrain(salida,0,1023);
  return salida;
}


void EEPROMWriteInt(int p_address, int p_value) {
  // write a 16bit value in eeprom
  byte Byte1 = ((p_value >> 0) & 0xFF);
  byte Byte2 = ((p_value >> 8) & 0xFF);
  EEPROM.write(p_address, Byte1);
  EEPROM.write(p_address + 1, Byte2);
}

int EEPROMReadInt(int p_address) {
  // read a 16 bit value in eeprom
  byte Byte1 = EEPROM.read(p_address);
  byte Byte2 = EEPROM.read(p_address + 1);
  long firstTwoBytes = ((Byte1 << 0) & 0xFF) + ((Byte2 << 8) & 0xFF00);
  return (firstTwoBytes);
}
Last edited by mrheat; Jun 19, 2014 at 12:22 PM. Reason: forgot to attach code :)
Jun 19, 2014, 12:33 PM
Registered User
Thread OP
Amazing job! That display fits perfectly in that small transmitter. and may be using an input multiplexer, the digital trims can be used, if you got 4 spare pins in the arduino (3 for mux channel select and 1 for input), after the display upgrade
Jun 19, 2014, 02:07 PM
wrong descision, wrong time
I have all the parts for mine, and I'm starting to put it together. I bought this OLED display:

http://www.banggood.com/0_96-Inch-I2...-p-922246.html

And I can run adafruit test code on it. The odd thing is the top lines (probably top 1/4) of the display are yellow, and the both 3/4 is cyan. I'm running the code for the 128x64 i2c board. I don't know if I have a defective unit, or if that is the way this thing works.

Anyways, I need to get the rest of things put together, and am looking forward to getting this working

Heath
Jun 19, 2014, 02:37 PM
Registered User
No a defect its the two colour version, Guess mix up at factory.
Jun 19, 2014, 03:11 PM
wrong descision, wrong time
Quote:
Originally Posted by SadSack
No a defect its the two colour version, Guess mix up at factory.
Ah well. I can make it work
Jun 19, 2014, 03:16 PM
Registered User
Could even be a bonus if only labels use top line.
Jun 19, 2014, 07:18 PM
Registered User
well, i just find this thread

i also made a simple transmiter with 8 ch and i use lcd 5110 .It can convert to use a lcd 0LED or lcd ST7565 and develop protocol easy
using for helicopter , airplan and multicopter

Jun 19, 2014, 07:36 PM
We can rebuild it!
djdavies83's Avatar
Nice display code, I like the trim possiton tabs you have around the edges.
Jun 19, 2014, 08:10 PM
Registered User
sorry ..... double
Jun 19, 2014, 08:11 PM
Registered User
Quote:
Originally Posted by do thien
well, i just find this thread

i also made a simple transmiter with 8 ch and i use lcd 5110 .It can convert to use a lcd 0LED or lcd ST7565 and develop protocol easy
using for helicopter , airplan and multicopter
do you use arduino or other ? Great.
Jun 19, 2014, 11:25 PM
Registered User
i use two version atmega128 and atmega32 . I will create new thread if everyone care
Jun 20, 2014, 01:09 AM
Registered User
Thread OP
Looks nice! If you want you can share code and schematics


Quick Reply
Message:

Thread Tools

Similar Threads
Category Thread Thread Starter Forum Replies Last Post
Sold Airtronics RD 6000 6CH Computer Radio w/ extras hobbyfun100 Aircraft - General - Radio Equipment (FS/W) 2 Feb 06, 2013 08:17 AM
Discussion need help with HobbyKing 2.4Ghz 6Ch Tx & Rx V2 berts Beginner Training Area (Aircraft-Electric) 2 Jan 26, 2013 11:58 PM
Sold Airtronics RD 6000 6CH Computer Radio w/ extras hobbyfun100 Aircraft - General - Radio Equipment (FS/W) 1 Jan 19, 2013 01:37 PM
Discussion Arduino -> FASST TX module ---> receiver codeforge DIY Electronics 1 Jan 02, 2013 01:42 PM
Help! Can't get Hobbyking 6ch tx to work with computer doh2doh Radios 2 Jun 14, 2012 11:07 AM