N-spoor – deel 8 – Wissels & ATtiny85s

Circa drie jaar geleden is er hier een laatste bericht geplaatst over mijn spoorbaantje. In de tussentijd wel nog een proefbaantje gemaakt, vooral om een aantal zaken zoals blokken en detectie uit te proberen, maar dat heb ik hier niet uitgewerkt. Het laatste deel (N-spoor treintjes – deel 7 – Wissels) ging over het inzetten van servomotortjes voor het omzetten van wissels. Ik wilde gebruikmaken van een ATtiny85 microcontroller-module (oorspronkelijk van DigiSpark) die nogal weerbarstig was: ik kreeg ‘m niet geprogrammeerd. Het lag daarmee stil.

Toch spookte die modules en/of de losse ATtiny85-chippies (waarvan ik er ook een aantal had liggen) al die tijd wel door mijn hoofd. Afgelopen dagen de zaak dus weer opgepakt!

Wat ik wilde was de AVR-microcontroller programmeren vanuit de Arduino-IDE. Een programmer had ik daarvoor ooit wel eens aangeschaft, maar vervolgens nooit iets mee gedaan: een USBasp kloon. Her en der te koop voor een paar euro’s. Hier staat het originele ding beschreven.

Met behulp van het programma Zadig eerst de juiste firmware/driver uploaden: kies libusbK (v.3.1.0.0), of hogere versie. Onder Windows 11 wordt ie dan keurig herkend in “Apparaatbeheer”.

Inmiddels was versie 3.1.0.0 dus beschikbaar.

De programmer zelf heeft een 10-pinnige ISP-aansluiting. Het bijgeleverde adapterbordje zet dit om naar een connector met 6 aansluitingen.

Op een gaatjesprint heb ik een 6-pins ISP-aansluiting gemaakt met een 8-pins voetje ernaast waar een ATtiny ingezet kan worden om te programmeren.

Standaard kan de Arduino IDE geen ATtiny’s programmeren, maar gelukkig bestaat er een speciale Arduino library voor: ATtinyCore. Na installatie daarvan het “Blink” programma aangepast tot “USBasp_test_Blink.ino”. In de Arduino IDE kies je onder ‘Tools’ als programmer de USBasp. Een knipperend ledje (met 1K weerstand) op pin 2 van de ATtiny85 (is PB3) laat zien dat het gelukt is.

Daarna het programma aangepast om een servo te bedienen. Als kloksnelheid in eerste instantie 8MHz (intern) gekozen, maar dat werkte niet goed. Blijkbaar werkt de AVR zonder bootloader intern op 1MHz. Door het programma in te stellen op 8MHz, schakelt ie wel over naar 8MHz, maar start op met 1MHz. Oké. Door eerst vanuit de Arduino IDE een bootloader en aansluitend het programma (ino-file) te sturen werkt e.e.a. wel goed!

De ATtiny85 aan de scope. Hier is de zwenkhoek in het programma nog ca. 180 graden.

Hieronder het programma.

/* Servo schakelaar

    Bestuur een servomotor 
 
*/

#include <Servo_ATTinyCore.h>

int pos = 0;              // servo positie

Servo myservo1;           // creeer een servo object 

int schakel1 = 2;         // PB2 is pin 7 = input voor besturing servo
int stand1 = 0;           // stand 0 of 1: aan/uit, li/re, enz.

void setup() {
  myservo1.attach(3);     // servo op PB3 is pin 2 van ATtiny85  
  pinMode (schakel1, INPUT_PULLUP);
}

void loop() {
  int schakel_status1 = digitalRead(schakel1);
  
  if (schakel_status1 == HIGH && stand1 == 1){
  for (pos = 0; pos <= 40; pos += 1) { 
    myservo1.write(pos);
    delay(15);
    stand1 = 0;
  }
  }
  
  if (schakel_status1 == LOW && stand1 == 0){
  for (pos = 40; pos >= 0; pos -= 1) {
    myservo1.write(pos);
    delay(15);
    stand1 = 1;
  }
  }
}

De aan te sturen servo moet dus een handmatig te bedienen wissel omzetten op mijn treinbaantje. Zo’n wissel heeft een klein handeltje dat in de lengte richting langs het spoor naar voren en naar achter bewogen moet worden over ca. 7 – 10 mm. In eerste instantie had ik een ingewikkelde constructie bedacht met een messing buisje en een verenstalen draad (zie hiervoor deel 7). Misschien kan het toch wat eenvoudiger. Een 3D ontwerpje gemaakt voor een aangepaste ‘hoorn’ voor de servo (rood gearceerd in onderstaande plaatje) die grijpt in handeltje van de wissel (het rode bolletje in het plaatje).

De afstand van het draaipunt van de servo onder de baan, tot daar waar het wisselhandeltje zit bovenop de baan is ca. 14 mm. Om te berekenen met hoeveel graden de servo moet uitslaan om het wissel om te zetten (er moet ca. 10 mm overbrugd worden) berekenen we de omtrek van de cirkel met een diameter van 14 mm.
Een volledige omwenteling van 360 graden is dus 2 x 14 mm x Pi = 28 x 3,14 = 87,9 mm. Een beweging van 1 mm is dan (360/88 mm) ca. 4,1 graad, dus een beweging van ca. 10 mm is ongeveer 40 graden. In de praktijk komt het ook net zo uit dus dat is wel fijn.

Onderstaand het uiteindelijke schema met 2 servo’s (SG90). Met de knop op PB2 is servo 1 om te zetten, met de knop op PB1 wordt servo 2 bestuurd.

Uiteindelijk moet deze module vanuit het besturingsprogramma via I2C aangestuurd worden, zoals aangegeven in onderstaand schema.

In het volgende deel verder met het testen van de wissel- en seinaansturing.

Geef een reactie

Je e-mailadres wordt niet gepubliceerd. Vereiste velden zijn gemarkeerd met *

Deze site gebruikt Akismet om spam te verminderen. Bekijk hoe je reactie-gegevens worden verwerkt.