TechTalk – Arduinos und DCC++ – Teil 1: Servos

Heute habe ich ein wenig herum experimentiert und drei Projekte angefasst, die ich in den kommenden Tagen in diesem Beitrag vertiefen möchte.

Arduino Mega 2560 +ESP8266 Wifi Kombi mit 16-Kanal Servomodul

Es ist geschafft. Ich habe mich wirklich etwas schwer getan zu überblicken, wie ich mit meinem seltsamen Arduina Mega2560 kompatiblem Mega2560 +ESP8266 Kombiboard und dem PCA9685 16-Kanal Servo Modul mittel C/MRI und JMRI meine Weichensteuerung realisiere. Aber dank der hilfreichen Tutorial von „Motorhomer“ ist es mir dann doch gelungen. Um so ernüchternder ist es zudem, wenn man realisiert, das man Tagelang über einen eigenen Flüchtigkeitsfehler gebrütet hat. Peinlich, peinlich. Aber es hat ja niemand gesehen…

Mega2560+ESP8266 mit PCA9685-Board und 15 Servos

Die Einrichtung von JMRI und C/MRI ist auf YouTube bereits ausreichend dokumentuert. Daher hier nur mein Code, für den Fall, dass daran Interesse besteht.

#include <Wire.h>
#include <Adafruit_PWMServoDriver.h>
#include <CMRI.h>
#include <Auto485.h>include

#define CMRI_ADDR 1
#define DE_PIN 2
int Tbit[8];

Adafruit_PWMServoDriver pwm = Adafruit_PWMServoDriver(); //setup the board address 0
Auto485 bus(DE_PIN); // Arduino pin 2 -> MAX485 DE and RE pins
CMRI cmri(CMRI_ADDR, 24, 48, bus);

void setup() {
Serial.begin(9600);
bus.begin(9600);

pwm.begin();
pwm.setPWMFreq(60); // This is the maximum PWM frequency
//pwm.setPWM(0, 0, 100);
//pwm.setPWM(1, 0, 200);
}

void loop(){
cmri.process();

Tbit[0] = (cmri.get_bit(0)); //T01
Tbit[1] = (cmri.get_bit(1)); //T02
Tbit[2] = (cmri.get_bit(2)); //T03
Tbit[3] = (cmri.get_bit(3)); //T04
Tbit[4] = (cmri.get_bit(4)); //T05
Tbit[5] = (cmri.get_bit(5)); //T06
Tbit[6] = (cmri.get_bit(6)); //T07
Tbit[7] = (cmri.get_bit(7)); //T08
Tbit[8] = (cmri.get_bit(8)); //T09
Tbit[9] = (cmri.get_bit(9)); //T10
Tbit[10] = (cmri.get_bit(10)); //T11
Tbit[11] = (cmri.get_bit(11)); //T12
Tbit[12] = (cmri.get_bit(12)); //T13
Tbit[13] = (cmri.get_bit(13)); //T14
Tbit[14] = (cmri.get_bit(14)); //T15
Tbit[15] = (cmri.get_bit(15)); //T16

if (Tbit[0] == 1){
pwm.setPWM(0, 0, 100);
Serial.println("T01: Abzweig");
}
if (Tbit[0] == 0){
pwm.setPWM(0, 0, 200);
Serial.println("T01: Geradeaus");
}
if (Tbit[1] == 1){
pwm.setPWM(1, 0, 100);
Serial.println("T02: Abzweig");
}
if (Tbit[1] == 0){
pwm.setPWM(1, 0, 200);
Serial.println("T02: Geradeaus");
}
if (Tbit[2] == 1){
pwm.setPWM(2, 0, 100);
Serial.println("T03: Abzweig");
}
if (Tbit[2] == 0){
pwm.setPWM(2, 0, 200);
Serial.println("T03: Geradeaus");
}
if (Tbit[3] == 1){
pwm.setPWM(3, 0, 100);
Serial.println("T04: Abzweig");
}
if (Tbit[3] == 0){
pwm.setPWM(3, 0, 200);
Serial.println("T04: Geradeaus");
}
if (Tbit[4] == 1){
pwm.setPWM(4, 0, 105);
Serial.println("T05: Abzweig");
}
if (Tbit[4] == 0){
pwm.setPWM(4, 0, 200);
Serial.println("T05: Geradeaus");
}
if (Tbit[5] == 1){
pwm.setPWM(5, 0, 105);
Serial.println("T06: Abzweig");
}
if (Tbit[5] == 0){
pwm.setPWM(5, 0, 200);
Serial.println("T06: Geradeaus");
}
if (Tbit[6] == 1){
pwm.setPWM(6, 0, 105);
Serial.println("T07: Abzweig");
}
if (Tbit[6] == 0){
pwm.setPWM(6, 0, 200);
Serial.println("T07: Geradeaus");
}
if (Tbit[7] == 1){
pwm.setPWM(7, 0, 105);
Serial.println("T08: Abzweig");
}
if (Tbit[7] == 0){
pwm.setPWM(7, 0, 200);
Serial.println("T08: Geradeaus");
}
if (Tbit[8] == 1){
pwm.setPWM(8, 0, 150);
Serial.println("T09: Abzweig");
}
if (Tbit[8] == 0){
pwm.setPWM(8, 0, 250);
Serial.println("T09: Geradeaus");
}
if (Tbit[9] == 1){
pwm.setPWM(9, 0, 150);
Serial.println("T10: Abzweig");
}
if (Tbit[9] == 0){
pwm.setPWM(9, 0, 250);
Serial.println("T10: Geradeaus");
}
if (Tbit[10] == 1){
pwm.setPWM(10, 0, 150);
Serial.println("T11: Abzweig");
}
if (Tbit[10] == 0){
pwm.setPWM(10, 0, 250);
Serial.println("T11: Geradeaus");
}
if (Tbit[11] == 1){
pwm.setPWM(11, 0, 150);
Serial.println("T12: Abzweig");
}
if (Tbit[11] == 0){
pwm.setPWM(11, 0, 250);
Serial.println("T12: Geradeaus");
}
if (Tbit[12] == 1){
pwm.setPWM(12, 0, 150);
Serial.println("T13: Abzweig");
}
if (Tbit[12] == 0){
pwm.setPWM(12, 0, 250);
Serial.println("T13: Geradeaus");
}
if (Tbit[13] == 1){
pwm.setPWM(13, 0, 150);
Serial.println("T14: Abzweig");
}
if (Tbit[13] == 0){
pwm.setPWM(13, 0, 250);
Serial.println("T14: Geradeaus");
}
if (Tbit[14] == 1){
pwm.setPWM(14, 0, 150);
Serial.println("T15: Abzweig");
}
if (Tbit[14] == 0){
pwm.setPWM(14, 0, 250);
Serial.println("T15: Geradeaus");
}
if (Tbit[15] == 1){
pwm.setPWM(15, 0, 150);
Serial.println("T16: Abzweig");
}
if (Tbit[15] == 0){
pwm.setPWM(15, 0, 250);
Serial.println("T16: Geradeaus");
}

}

Die Zeilen, die „Serial.println(„T02: Geradeaus„);“ enthalten sind unnötig.

Nachtrag. Irgendwie war mir der Mega doch zu schade für eine Servoansteuerung. Ich habe das Projekt nun mit einem Arduino Nano realisiert. Der Mega hat einen ESP8266 an Board und so viel Speicher, dass er zu höherem gefertigt wurde. Irgendein Projekt bei dem mir das WiFi Modul gelegen kommt findet sich bestimmt. Evtl. Baue ich damit einen drahtlosen DCC++ Handheld-Regler mit Touchscreen oder so.

Arduino UNO (AZ-Delivery UNO) mit Sensor Shield und IR-ProxiSensoren

Dieses Projekt wurde letztlich mit einem Arduino Nano realisiert. Es stellte sich als trivial heraus. Daher erwähne ich es nur der Vollständigkeit halber. Der Nano ist im Gründe ein UNO nur eben viel kleiner. Klasse Teil. Werde ich in Zukunft öfter benutzen.