Go Down

Topic: Rasperry Pi --> Arduino (Software)? (Read 520 times) previous topic - next topic

Hallo!

Ich würde gern einen Heng Long RX18 mittels Arduino ansteuern (Nachbau des Protokolls sozusagen)

Praktischerweise gibt es dafür schon ein Programm für den Rasperry Pi: https://github.com/tsuki/raspberrytank/blob/master/rt_ssh.c
Die Grundlagen dazu finden sich hier: http://blog.ianrenton.com/raspberry-pi-day-1-accessories-assemble/

Leider bin ich noch etwas planlos (von einfacheren Dingen mal abgesehen).

Könnte man das so umstricken das es auf Arduino läuft?




Trib

Hallo einherjer,

klar kann man das  8)
Generell sind die Funktionen nicht so schwierig nachzubilden. Zum einen Liegt der Code ja in C vor. Den (bzw. einen Teil davon) könnte man einfach per Include im Arduino-Code einbinden.
Die Funktionalität sieht aber auch nicht so schwierig aus, als dass man diesen nicht mit Arduino Code nachbilden könnte.

Schau dir mal an was die Funktionen sendCode() & sendBit() machen, bzw. deren Aufrufe in der Main-Methode.
Vieles vom Rest ist einfach nur Raspberry Pi-Spezifisch und verwirrt nur. (Dort muss die Ansteuerung der Pins etwas aufwändiger eingebunden werden. Das ist beim Arduino ja schon alles mit drin)

So, mit etwas einlesen hab ich es zumindest so weit das es sich kompilieren lässt.

Am Wochenende mal probieren ob da was vernünftiges rauskommt.

Könnte man ansonsten schon mal was verbessern? Gerade in Bezug auf die Delays, es soll ja später nebenbei auch noch was anderes laufen.

Code: [Select]
#include <util/delay.h>

// pin that connects to the Heng Long main board
int RXPin = 7;

// Heng Long tank bit-codes
int idle = 0xFE40121C;
int ignition = 0xFE401294;
int left_slow = 0xFE400608;
int left_fast = 0xFE400010;
int right_slow = 0xFE401930;
int right_fast = 0xFE401E2C;
int fwd_slow = 0xFE200F34;
int fwd_fast = 0xFE000F3C;
int rev_slow = 0xFE580F08;
int rev_fast = 0xFE780F00;
int turret_left = 0xFE408F0C;
int turret_right = 0xFE410F28;
int turret_elev = 0xFE404F3C;
int fire = 0xFE442F34;
int machine_gun = 0xFE440F78;
int recoil = 0xFE420F24;
int i;
char inchar;

// Function declarations
void sendCode(int code);
void sendBit(int bit);

void setup()                    // run once, when the sketch starts
{
  pinMode(RXPin, OUTPUT);      // sets the digital pin as output
  Serial.begin(9600);
 
  // Send the idle and ignition codes
  digitalWrite(RXPin, LOW);
  Serial.println("Idle");
  for (i=0; i<40; i++)
  {
    sendCode(idle);
  }
  Serial.println("Ignition");
  for (i=0; i<10; i++)
  {
    sendCode(ignition);
  }
  Serial.println("Waiting for ignition");
  for (i=0; i<300; i++)
  {
    sendCode(idle);
  }
}


void loop()                     // run over and over again
{
  if (Serial.available() > 0) {
    // Loop, sending movement commands indefinitely
    do {
      Serial.println("Ready: ");
      inchar = Serial.read();
      if (inchar == 'w') {
        Serial.println("Forward");
        for (i=0; i<100; i++)
        {
          sendCode(fwd_fast);
        }
        sendCode(idle);
      }
      else if (inchar == 's') {
        Serial.println("Reverse");
        for (i=0; i<100; i++)
        {
          sendCode(rev_fast);
        }
        sendCode(idle);
      }
      else if (inchar == 'a') {
        Serial.println("Left");
        for (i=0; i<10; i++)
        {
          sendCode(left_fast);
        }
        sendCode(idle);
      }
      else if (inchar == 'd') {
        Serial.println("Right");
        for (i=0; i<10; i++)
        {
          sendCode(right_fast);
        }
        sendCode(idle);
      }
      else if (inchar == 'q') {
        Serial.println("Turret Left");
        for (i=0; i<25; i++)
        {
          sendCode(turret_left);
        }
        sendCode(idle);
      }
      else if (inchar == 'e') {
        Serial.println("Turret Right");
        for (i=0; i<25; i++)
        {
          sendCode(turret_right);
        }
        sendCode(idle);
      }
      else if (inchar == 'z') {
        Serial.println("Turret Elev");
        for (i=0; i<50; i++)
        {
          sendCode(turret_elev);
        }
        sendCode(idle);
      }
      else if (inchar == 'x') {
        Serial.println("Fire");
        for (i=0; i<50; i++)
        {
          sendCode(fire);
        }
        sendCode(idle);
      }
    } while (inchar != '.');

    Serial.println("Ignition Off");
    for (i=0; i<10; i++)
    {
      sendCode(ignition);
    }
    Serial.println("Idle");
    for (i=0; i<40; i++)
    {
      sendCode(idle);
    }
 
  return;

  }
}

// Sends one individual code to the main tank controller
void sendCode(int code) {
  // Send header "bit" (not a valid Manchester code)
    digitalWrite(RXPin, HIGH);
    _delay_us(500);
  // Send the code itself, bit by bit using Manchester coding
  int i;
  for (i=0; i<32; i++) {
    int bit = (code>>(31-i)) & 0x1;
    sendBit(bit);
  }
 
  // Force a 4ms gap between messages
    digitalWrite(RXPin, LOW);
    _delay_us(3333);
} // sendCode

// Sends one individual bit using Manchester coding
// 1 = high-low, 0 = low-high
void sendBit(int bit) {
  //  Serial.println("%d", bit);

  if (bit == 1) {
    digitalWrite(RXPin, HIGH);
    _delay_us(250);
    digitalWrite(RXPin, LOW);
    _delay_us(250);
  } else {
    digitalWrite(RXPin, LOW);
    _delay_us(250);
    digitalWrite(RXPin, HIGH);
    _delay_us(250);
  }
} // sendBit

Go Up