Schaltstufensimulation - Vom Arduino zum ATtiny
Ich habe schon in anderen Threads in diesem Forum über Simulationen alter Technik Beiträge geschrieben, zum Beispiel hier:
https://www.rc-network.de/threads/w...nlagen-in-retro-modellen.427436/post-12033518
Aber das Thema passt eigentlich viel besser in diesen Thread, den ich erst kürzlich entdeckt habe.
Der nachfolgende Beitrag ist eigentlich nur eine Variante des oben verlinkten aber mit einem ATtiny85 realisiert. Der Vorteil des ATtiny liegt in seiner Größe. Passt der ProMini gerade noch in ein hier Varioton-Schaltstufengehäuse.
Oben zum Größenvergleich der ATtiny draufgesetzt.
Ein Forumsteilnehmer schrieb im anderen Thread zu einem meiner früheren Posts mit dem Arduino, ob ich schon mal einen ATtiny probiert hätte. Ich kannte damals den ATtiny noch nicht und suchte bei Ebay entsprechende Angebote und fand diese auch. Glücklicherweise läßt sich derr ATtiny mittels Plugins auch mit der Arduino IDE programmieren. Ein paar Hürden bis zum Funktionieren des Ganzen galt es aber schon zu überwinden. Der ATtiny arbeitet mit 8 MHz im Vergleich zu den 16 MHz meiner bisher verwendeten Arduinos. Das muss an mehreren Stellen wie in der Konfiguration des Prozessors und bei der Programmierung berücksichtigt werden. Beginnen wir mit der Konfiguration des Prozessors. Hier müssen diverse Einstellungen (Fuses) so gesetzt werden, dass der Prozessor nicht mit den Werkseinstellungen 1 MHz taktet sondern eben mit 8 MHz. Dies geschieht mit der Arduino IDE mittels pseudobrennen des Bootloaders. Vorher muss man aber noch die entsprechenden Libraries einbinden. Es würde zu weit führen dies hier ausführlich darzustellen. Dazu gibt es ausreichend Webseiten.
https://nurazur.wordpress.com/2017/...-oder-1-mhz-taktfrequenz-mit-der-arduino-ide/
https://leap.tardate.com/playground/attiny/at8mhz/
https://wolles-elektronikkiste.de/attiny85-84-45-44-25-24-programmieren
Ich habe mit dem Arduino versucht zwei Varioprop 2,4V Servos anzusteuern. Das war aber eine langsame Angelegenheit. Man würde die Servos am liebsten anschieben. Vielleicht ließe sich mit ARDUINO Assembler ein Performancegewinn erzielen, so dass man zwei Servos mit einem Arduino ansteuern könnte. Mit dem früher von mir veröffentlichten C-Programm für die Varioprop Micro 05 2,4V Servos läuft nur ein Servo mit vernünftiger Geschwindigkeit. In einer Varioprop- Schaltstufe für 2 Servos kann man locker zwei ATiny unterbringen.
Am besten verwendet man wie im Bild oben Prozessorsockel um den ATtiny von seinem Arbeitsplatz ins Programmierboard umstecken zu können.
Unten wird der Empfänger „simuliert“.
Die ursprüngliche Platine wurde von allem bis auf die Steckkontakte befreit damit ein FrSky-kompatibler cPPM-Empfänger Platz finden konnte. Vorher war ein Orange-Empfänger installiert, der aber immer unterschiedliche PPM-Werte lieferte. Das PPM-Summen-Signal wird über die Steckkontakte der Schaltstufen durchgeleitet. Jede Schaltstufe holt sich das Signal heraus, für das sie programmiert wurde.
Hier der Code, der hier schon einmal für den Arduino veröffentlicht wurde und von mir auf den ATtiny angepasst wurde. Der Code exisitiert in mehreren Varianten, für Arduino, ATtiny, PPM-Empfänger, PWM-Empfänger, Empfänger mit SBUS und für Bellamatic und Varioprop-Micro 05-Servos 2,4V ohne Elektronik:
C:
#undef F_CPU
#define F_CPU 8000000UL // ATtiny mit 8 MHz
#include "avr/interrupt.h"
// Für Bellamatic Servos
volatile unsigned long int a, b, c = 0;
volatile int x[15], ch1[15], ch[7], i;
//specifing arrays and variables to store values
// For ATTINY
//
// Prozessorpin Bezeichnung hier
// 1 PB5
// 2 PB3 in_1
// 3 PB4 in_2
// 4 GND
// 5 PB0
// 6 PB1
// 7 PB2 external Interrupt (Empfängersignal)
// 8 Vcc
const int in_1 = PB4 ; // H-Bridge zu- bzw. wegschalten PB4
const int in_2 = PB3 ; // bestimmt die Motorlaufrichtung PB3
const int intrpt = PB2; // setze interrupt auf PB2
const int schaltstufe = 3; //TAER
const int MotorSpeed = 160; // max. 255
const int Toleranz = 40;
const int KnueppelMitte = 500;
const int KnueppelMitte_plus_Tol = KnueppelMitte + Toleranz;
const int KnueppelMitte_minus_Tol = KnueppelMitte - Toleranz;
// Werte abgestimmt auf Bellamatic II
int KnueppelPos = 500 ; // 500
void setup() {
ch[schaltstufe] = 500; // Servo neutral // 500
DDRB |= (1 << PB3); // pinMode(in_2, OUTPUT);
DDRB |= (1 << PB5); // pinMode(in_1, OUTPUT);
PORTB |= (1 << PORTB2); // ... und als Pullup setzen //pinMode(intrpt, INPUT_PULLUP);
GIMSK |= (1 << INT0); // enabling the INT0 (external interrupt)
MCUCR |= (1 << ISC01); // Configuring as falling edge
sei(); // enabling global interrupt
}
void loop() {
read_rc();
if (ch[schaltstufe] >= 0 && ch[schaltstufe] <= 1000) {
KnueppelPos = ch[schaltstufe];
}
if (KnueppelPos > KnueppelMitte_plus_Tol) { //Servo dreht links/hoch
analogWrite(in_1, MotorSpeed) ;
}
if (KnueppelPos < KnueppelMitte_minus_Tol ) { //Servo dreht rechts/tief
analogWrite(in_2, MotorSpeed) ;
}
if (KnueppelPos < KnueppelMitte_plus_Tol && KnueppelPos > KnueppelMitte_minus_Tol) { // Knüppel in Neutralposition
// Wenn Neutralstellung erreicht, Servobewegung stoppen
analogWrite(in_1,0) ;
analogWrite(in_2,0) ;
}
} // loop
ISR (INT0_vect) { // Interrupt service routine {
//this code reads value from RC receiver from PPM pin (PB2)
//this code gives channel values from 0-1000 values
// -: ABHILASH :-
// https://www.instructables.com/Reading-RC-Receiver-PPM-Signal-Using-Arduino/
a=micros(); //store time value a when pin value falling
c=a-b; //calculating time inbetween two peaks
b=a; //
x[i]=c; //storing 15 value in array
i=i+1; if(i==15){for(int j=0;j<15;j++) {ch1[j]=x[j];}
i=0;}}//copy store all values from temporary array another array after 15 reading
void read_rc(){
int i,j,k=0;
for(k=14;k>-1;k--){if(ch1[k]>10000){j=k;}} //detecting separation space 10000us in that another array
for(i=1;i<=6;i++){ch[i]=(ch1[i+j]-1000);}} //assign 6 channel values after separation space
Interessant wäre die Hauptschleife und die Interrupt-Routine in ATtiny Assembler zu schreiben. Man würde dadurch den Overhead den Compiler so erzeugen einsparen und könnte effizienteren Code gewinnen.
Gibt es eine ordentliche Beschreibung des ATtiny Assembers? Vielleicht kann ja jemand den ATtiny-Assembler und fühlt sich herausgefordert?
Das ist meine Versuchsanordnung. Es funktioniert!
Nochmal eine Bitte: Wer kaputte Varioton-Schaltstufen hat, denke an mich, ich würde gerne weitere Schaltstufen simulieren und auch in einem passenden Modellflugzeug wie z.B. Amigo oder ähnliches ausprobieren. Kontaktaufnahme bitte per PN.