Archiv der Kategorie: Auto

RC Car Speedometer

Basierend auf einem TTGO LoRa mit OLED 128×64 mit BN-880 GPS.

Anschluss

  • Batterie/Lipo an den unteren Bat-Connector
  • GPS an 5V/12(RX)/13(TX)/GND

Arduino mit der ESP32-Erweiterung, Board TTGO-LoRa-OLED.

Features

  • 5 Hz GPS-Datenrate
  • Die 5 höchsten Geschwindigkeiten, die höchste extra groß angezeigt
  • Satellitenanzahl-Anzeige

Hier der Code:

//Libraries for OLED Display
#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>

const unsigned char ubxRate1Hz[]  = 
  { 0x06,0x08,0x06,0x00,0xE8,0x03,0x01,0x00,0x01,0x00 };
const unsigned char ubxRate5Hz[]  =
  { 0x06,0x08,0x06,0x00,200,0x00,0x01,0x00,0x01,0x00 };
const unsigned char ubxRate10Hz[]  =
  { 0x06,0x08,0x06,0x00,100,0x00,0x01,0x00,0x01,0x00 };
const unsigned char ubxRate16Hz[]  =
  { 0x06,0x08,0x06,0x00,50,0x00,0x01,0x00,0x01,0x00 };

// Disable specific NMEA sentences
const unsigned char ubxDisableGGA[]  =
  { 0x06,0x01,0x08,0x00,0xF0,0x00,0x00,0x00,0x00,0x00,0x00,0x01 };
const unsigned char ubxDisableGLL[]  =
  { 0x06,0x01,0x08,0x00,0xF0,0x01,0x00,0x00,0x00,0x00,0x00,0x01 };
const unsigned char ubxDisableGSA[]  =
  { 0x06,0x01,0x08,0x00,0xF0,0x02,0x00,0x00,0x00,0x00,0x00,0x01 };
const unsigned char ubxDisableGSV[]  =
  { 0x06,0x01,0x08,0x00,0xF0,0x03,0x00,0x00,0x00,0x00,0x00,0x01 };
const unsigned char ubxDisableRMC[]  =
  { 0x06,0x01,0x08,0x00,0xF0,0x04,0x00,0x00,0x00,0x00,0x00,0x01 };
const unsigned char ubxDisableVTG[]  =
  { 0x06,0x01,0x08,0x00,0xF0,0x05,0x00,0x00,0x00,0x00,0x00,0x01 };
const unsigned char ubxDisableZDA[]  =
  { 0x06,0x01,0x08,0x00,0xF0,0x08,0x00,0x00,0x00,0x00,0x00,0x01 };


#define Battadc 34

//OLED pins
#define OLED_SDA 4
#define OLED_SCL 15 
#define OLED_RST 16
#define SCREEN_WIDTH 128 // OLED display width, in pixels
#define SCREEN_HEIGHT 64 // OLED display height, in pixels

#define SDA 21
#define SCL 22

Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RST);

bool enable_dbg;
bool sig_valid, sig_rxok;
float sig_speed, saved_spd;
int sig_sats;
float maxspeed[5];

// Cut out the wanted substring from a comma-separated string
static String extract_val(char *buf, int len, int cpos)
{
  String str="";
  int i,cc=0,cs=0,ce=255;
  for (i=0;i 0)
        sig_valid = true;
      Serial.println(s);
      sig_speed = s.toFloat();
      saved_spd = sig_speed;
    }
    else if (buf[2]=='G' && buf[3]=='G' && buf[4]=='A') {
      display.print(buf);
      String s = extract_val(buf, pos, 7);
      Serial.println(s);
      sig_sats = s.toInt();
    }
  }
  else if (c=='$') pos=0;
  else if (pos < sizeof(buf))
    buf[pos++] = c;
}

//Warteschleife, die ankommende Daten vom GPS Modul verarbeitet und den Status des Tasters prüft
static void smartdelay(unsigned long ms)
{
  unsigned long start = millis();
  do 
  {
    while (Serial2.available()) {
      char c=Serial2.read();
      parse_gps(c);
      if (enable_dbg) Serial.print(c);
      //display.print(c);
    }
    //display.display();
  } while (millis() - start < ms);
}

static void sendUBX( const unsigned char *progmemBytes, size_t len )
{
  Serial2.write( 0xB5 ); // SYNC1
  Serial2.write( 0x62 ); // SYNC2

  uint8_t a = 0, b = 0;
  while (len-- > 0) {
    uint8_t c = ( *progmemBytes++ );
    a += c;
    b += a;
    Serial2.write( c );
  }

  Serial2.write( a ); // CHECKSUM A
  Serial2.write( b ); // CHECKSUM B
  delay(100);
}

static void updateRate()
{
  sendUBX(ubxRate5Hz, 10);
}

void setup() { 
  pinMode(0, INPUT_PULLUP); // button
  pinMode(SCL, INPUT_PULLUP); // I2C of GPS compass
  pinMode(SDA, INPUT_PULLUP);

  analogSetAttenuation(ADC_0db); // control sensitivity; ADC_11db, ADC_6db, ADC_2_5db, ADC_0db
  pinMode(Battadc, INPUT);
  adcAttachPin(Battadc);

  Serial.begin(115200); // debug
  Serial2.begin(9600,SERIAL_8N1,12,13); // GPS
  
  //reset OLED display via software
  pinMode(OLED_RST, OUTPUT);
  digitalWrite(OLED_RST, LOW);
  delay(20);
  digitalWrite(OLED_RST, HIGH);
  
  //initialize OLED
  Wire.begin(OLED_SDA, OLED_SCL);
  if(!display.begin(SSD1306_SWITCHCAPVCC, 0x3c, false, false)) { // Address 0x3C for 128x32
    //Serial.println(F("SSD1306 allocation failed"));
    for(;;); // Don't proceed, loop forever
  }

  display.setTextColor(WHITE);
  display.setTextSize(1);
  display.clearDisplay();
  display.display();

  delay(2000);
  sendUBX(ubxDisableGLL, 12);
  sendUBX(ubxDisableGSA, 12);
  sendUBX(ubxDisableGSV, 12);
  sendUBX(ubxDisableRMC, 12);
  sendUBX(ubxDisableZDA, 12);
  Serial2.print("$PUBX,41,1,0007,0003,19200,0*25\r\n");
  Serial2.flush();
  delay(100);
  Serial2.end();
  Serial2.begin(19200,SERIAL_8N1,12,13);
  delay(1000);
  updateRate();
}

void loop() {
  int i;
  bool spdwritten = false;
  char tmp[32];
  float spd;
  
  smartdelay(0);
  display.clearDisplay(); // drawString(x,y,text);? or ACROBOTIC_SSD1306 with setTextXY/putString
  display.setCursor(0, 0);
  if (sig_valid) {
    spd = sig_speed;
    sig_speed = 0.0;
    // show maximum speed, with 5 places to see glitches
    display.println("Geschwindigkeit (max)");
    for (i=0; i<5; i++) {
      if (spd > maxspeed[i] && !spdwritten) {
        maxspeed[i] = spd;
        spdwritten = true;
        break;
      }
    }
    for (i=0; i<5; i++) {
      if (i==0)
        display.setTextSize(2);
      sprintf(tmp, "%4.1f km/h", maxspeed[i]);
      display.println(tmp);
      if (i==0)
        display.setTextSize(1);
    }
    // show current speed
    sprintf(tmp,"S%4.1f  Sats %3d", saved_spd, sig_sats);
    display.print(tmp);
  } else {
    display.println("No GPS fix.");
    if (sig_rxok)
      display.println("GPS RX ok");
    sprintf(tmp,"         Sats %3d", sig_sats);
    display.print(tmp);
  }
  display.display();
  int vbatt = analogRead(Battadc);

  if (digitalRead(0)==0) { // clear
    for (i=0;i<5; i++)
      maxspeed[i] = 0.0;
    display.clearDisplay();
  }
}

Kleiner Flitzer

Der Turnigy 1/16 Buggy – für 88EUR zu haben. Da habe ich noch ein paar Akkus mitbestellt. So kommt er fertig gebaut an:

20160518_194326_web

20160518_220045_web

20160518_202521_web

Aber ich musste noch etwas Hand anlegen:

Regler anlernen (genauso unsensibel wie der vom Basher – langsam geht nicht)
Ritzelspiel einstellen
Dämpfer neu befüllen

Die Ersatzteile sind spottbillig und es gibt Carbon- und Alutuning 🙂

So flitzt er ganz ordentlich – aber an die Power des kleinen Traxxas E-Revo kommt er noch lange nicht hin. Da wird wohl irgendwann ein weiterer Kauf stattfinden 🙂

Ich will Wheelies und Überschläge wenn man bei 50km/h noch den Gashebel durchzieht!!!
Dafür sind dann gebraucht 200€ hinzulegen.

Zweitwagen

der Cobra Serpent 811BE 2.0 gebraucht auf dem Kleinanzeigenmarkt für 320€:

20160518_183928_web

Leider ist die verbaute Technik unterste Schublade – der Regler ist zumindest dumm wie Brot, kann gerade mal den Gasweg lernen und ist so sensibel wie ein Vorschlaghammer.

Das Servo ist ein 6kg Hobbyking (aus einem Glattbahnracer). Da hab ich doch mal ein Savöx gekauft. Zum Einbauen musste ich das halbe Auto zerlegen, darunter auch das Servo – denn sonst passt es nicht durch die Öffnung!! Wer hat sich das bloß ausgedacht…

Die Absima CR4T hatte ich ja schon. Der Empfänger ist fast zu groß für die RC-Box!

Basher 120A Regler anlernen: Beim Anschalten Setupknopf drücken, bis die grüne LED angeht. Dann Gas auf Maximal. Wenn die LED auf Rot wechselt, Gas auf Minimal. Und zuletzt wenn die LED rot+grün leuchtet – neutral. Fertig. Das wars. Mehr kann er nicht!

Der Motor sieht recht potent aus, aber der stammt natürlich auch aus der Super-Billig HK-Karre.

Der Serpent selber sieht recht gut erhalten aus. Einzig an den Dogbones erahnt man, dass das Auto schon ein paar Runden in einer Halle gedreht haben muss. Denn es ist fast perfekt sauber. An den Radlagern sieht man dafür leicht Rost. Die Mechanik fühlt sich gut an, leichtgängig und die Lenkung spielarm. Die Räder wirken leicht zerbrechlich. Aber ich hab ja genug 🙂

Lagertausch

20160428_193524

Ich bereue heute, den Typhon nach der Pfütze nicht mit wd40 abgesprüht zu haben.

Aber jetzt hat er frische Lager und ist wieder sauber.

Schaut nicht mehr ganz neu aus

20160424_181538_web

Heute 3-4mal durch die Pfützen (war aber keine Absicht). Danach zieht das Auto sauber den Dreck an.

Beim nächsten Umbau wird er dann grundgereinigt…

Mittlerweile hat er 7-8 Akkus (ca. 3-4h Fahrzeit) hinter sich – Schäden: keine
(außer ein Rad aus einem zugekauften 4er-Set, die sind nicht so toll – aber auch damit kann man noch fahren)
Ich schone das Gerät auch nicht 🙂

Arrma Typhon Bashen

web_20160420_200010_HDR

web_20160420_184559

2 Akkus durch gesprungen, gecrasht, weiter gesprungen – der Typhon hat gelitten. Zum Schluss auf’s Ganze gegangen! Meterhohe Sprünge sind machbar 🙂

4-5x Cartwheeling (“Räder” schlagender Buggy)
3x böse Nasenlandung
Unzählig oft aufs Heck (flach landen muss ich halt trainieren)
1x schräg frontal in einen Sprunghügel gecrasht (+ Cartwheeling)
2-3x frontal überschlagen

Fazit: Hält!
Dieter’s 2s 7000er passen auch in den Schacht saugend rein (als 2x2s)

Video kommt noch.