Jeg har overvejet at lave den næste sportavle ud fra dette princip. Mine sporskifter skal drives af en servo.
Jeg vil så lave 2 servotestere, som giver en impuls for henholdsvis ret og afvigende på sporskiftet.
På tavlen vil jeg benytte en vippeafbryder, som så afhængigt af stilling, videresender enten impuls fra den ene, eller den anden servotester.
Jeg vil så naturligvis kopiere impulserne fra testerne til alle de andre vippeafbrydere... , og derved de andre sporskifter..
Nogen, der har erfaring med dette?
Jeg ønsker ikke en DCC styret sportavle...
Forslag modtages..
Mvh Steen
...og i tror det ikke kan lade sig gøre at indbygge digitaldekodere i spor z... Iøvrigt ganske vild med modeller, også dem af tog..
je
Egå
Indlæg: 135
void MoveToPos(char servonr, int pos)
{
// opsæt TLC5940 til den rette servoadresse vha. servonr.
tlc_setServo0 = servo1;
tlc_setServo1 = servo2;
// tell servo to go to position in variable 'pos'
delay(15); // waits 15ms for the servo to reach the position
}
Her er de fejlkoder som kommer, når jeg vil kompilere programmet:
error: 'tlc_setServo0' was not declared in this scope
error: 'servo1' was not declared in this scope
error: 'tlc_setServo1' was not declared in this scope
error: 'servo2' was not declared in this scope
Hej Lars,
Der er ikke noget sted i koden, at "tlc_setServo1", "tlc_setServo2", "servo1" og "servo2" er erklæret, det vil sige, at du ikke har fotalt programmet, hvad de er for nogle typer.
Når jeg kigger i eksemplet, der følger med TLC 5940-biblioteket, så kan jeg se, at "tlc_setServo" er en funktion med to parametre: servonummer og ønsket vinkel.
Din funktion "movePos(servo, pos)" giver ikke rigtigt nogen meming, da du ikke benytter de to angivne parametre. Det lugter dog lidt af, at du vil bede den flytte en servo til en given position, men det findes faktisk i funktionen "tlc_setServo".
Prøv at glemme din "movePos og i stedet oppe i if-linjerne
if(servo1_L==0)
{
MoveToPos(1, POS_1_LEFT);
servo1_L=1;
erstatte "movePos" med "tlc_setServo":
if(servo1_L==0)
{
tlc_setServo(1, POS_1_LEFT);
servo1_L=1;
Jeg har desværre ikke lige nu mulighed for at prøve det af, så det er ren teori.
/Jan
Lars LCS
Indlæg: 10
Hej Lars
Velbekom. Håber, det kommer til at virke for dig. Glæder mig til at høre om dine erfaringer
Hej Skott og andre
Så er jeg kommet lidt videre mht. at styre hastigheden på servo'en.
Programmet er kom til at se sådan her ud:
// Styrring af 1 servo med 2 knapper (digital indgang)
#include "Tlc5940.h"
#include "tlc_servos.h"
int button1 = 5; //button pin, connect to ground to move servo
int press1 = 0;
int button2 = 6; //button pin, connect to ground to move servo
int press2 = 0;
int var;
void setup() {
pinMode(button1, INPUT);
pinMode(button2, INPUT);
tlc_initServos(); // Note: this will drop the PWM freqency down to 50Hz.
tlc_setServo(0, 60); // servo 0 drej til 60 grader ved opstart
Tlc.update();
}
void loop() {
press1 = digitalRead(button1);
if (press1 == HIGH) {
var = tlc_getServo(0);
while (var < 140){
var++;
tlc_setServo(0,var); // servo 0 drej til 140 grader
Tlc.update();
delay(30);
}
}
press2 = digitalRead(button2);
if (press2 == HIGH) {
var = tlc_getServo(0);
while (var > 60){
var--;
tlc_setServo(0,var); // servo 0 drej til 140 grader
Tlc.update();
delay(30);
}
}
}
Det var første step
nu har jeg fået et SX1509 board hjem, der kan styre op til 64 input (knapper), så nu skal jeg igang med "lege" med sådan en, og se og jeg kan hitte ud at det 
Mvh
Lars LCS
Lars Skjærlund
Rødovre
Webmaster
Indlæg: 4.215
Bravo!
Du gør fremskridt - det begynder at ligne noget rigtigt.
Du har dog stadig ikke løst det fundamentale problem, at dit loop() hænger fuldstændigt, indtil en servo er flyttet helt på plads.
Det burde nok være din næste opgave: Du har brug for at gemme servoindstillingerne i nogle variable udenfor dit loop(), så du kan køre rundt og rundt og rundt i loop'en uden forsinkelser. For hver passage af loop'en bør du så undersøge, om der er en eller flere servoer, der har brug for at blive flyttet. Start med simple variable - i længden er det dog nok bedre at bruge nogle datastrukturer, men det kan du lære bagefter.
MVH
Lars
Skott
Ingeniør
Indlæg: 1.939
Godt gået, Lars
Så snart man har lidt oppe at køre, bliver det så meget lettere - og ikke mindst sjovere at eksperimentere med programmet. Godt at se, du også har fået tlc-kredsen inkluderet i dit program. Når du får nogle flere servoer op at køre, kunne du måske lave en lille film og dele med os. Det er jo spændende at se andres fremskridt
Med venlig hilsen
Skott
Lars LCS
Indlæg: 10
Bravo!
Du gør fremskridt - det begynder at ligne noget rigtigt.
Du har dog stadig ikke løst det fundamentale problem, at dit loop() hænger fuldstændigt, indtil en servo er flyttet helt på plads.
Det burde nok være din næste opgave: Du har brug for at gemme servoindstillingerne i nogle variable udenfor dit loop(), så du kan køre rundt og rundt og rundt i loop'en uden forsinkelser. For hver passage af loop'en bør du så undersøge, om der er en eller flere servoer, der har brug for at blive flyttet. Start med simple variable - i længden er det dog nok bedre at bruge nogle datastrukturer, men det kan du lære bagefter.
Tak, jeg fik dog også lidt hjælp
Jeg har "tryllet" lidt videre, og har lavet et program hvor jeg kun har en knap til servo'en.
Desuden har jeg lagt selve servo bevælgensen uden for loop'et, så jeg kun skal kalde om den skal til højre eller venstre.
Hvis det er det du mener, med at flytte det uden for loopet?
Her er programmet:
// Styrring af 1 servo med 1 knap (digital indgang)
#include "Tlc5940.h"
#include "tlc_servos.h"
const int buttonPin = 5; // The number of the Pushbutton pin
int buttonState = 0; // Variable for reading the pushbutton status
int directionState = 0; // Variable for reading direction of the servo
int var;
int pos = 0; // Variable to store the servo position
void setup() {
pinMode(buttonPin, INPUT); // initialize the pushbutton pin as an input
tlc_initServos(); // Note: this will drop the PWM freqency down to 50Hz.
tlc_setServo(0, 60); // servo 0 drej til 60 grader ved opstart
Tlc.update();
}
void loop() {
// read the state of the pushbutton value:
buttonState = digitalRead(buttonPin);
if (directionState ==
{
//The button is pushed
if (buttonState == HIGH) {
directionState = 1;// The direction for the servo is clockwise
sp01_V();
}
}
else if (directionState == 1) {
// The button is pushed
if (buttonState == HIGH) {
directionState = 0; // The direction for the servo is anti-clockwise
sp01_H();
}
}
}
// Sporskifte 01 V
void sp01_V() {
var = tlc_getServo(0);
while (var < 140) {
var++;
tlc_setServo(0, var); // servo 0 drej til 140 grader
Tlc.update();
delay(30);
}
}
// Sporskifte 01 H
void sp01_H() {
var = tlc_getServo(0);
while (var > 60) {
var--;
tlc_setServo(0, var); // servo 0 drej til 140 grader
Tlc.update();
delay(30);
}
}
Mvh
Lars LCS
Lars Skjærlund
Rødovre
Webmaster
Indlæg: 4.215
Da' Lars.
Hvis det er det du mener, med at flytte det uden for loopet?
Delvist: Ja, du har lavet nogle eksterne funktioner, og det var en del af det, jeg mente.
Men du har stadig et loop, der hænger - det har du ikke løst endnu: Når du kalder en af dine funktioner, vender du ikke tilbage til dit loop(), før servoen er flyttet helt på plads.
Prøv at overveje, hvad der ville ske, hvis du bevarede programmet her (næsten) uændret - men flyttede delay(30) kaldet fra dine servofunktioner og tilbage til loop()?
MVH
Lars
Lars LCS
Indlæg: 10
Godt gået, Lars
Så snart man har lidt oppe at køre, bliver det så meget lettere - og ikke mindst sjovere at eksperimentere med programmet. Godt at se, du også har fået tlc-kredsen inkluderet i dit program. Når du får nogle flere servoer op at køre, kunne du måske lave en lille film og dele med os. Det er jo spændende at se andres fremskridt
Ja, det er klar sjovere når man kan få den til at gøre hvad man gerne vil, synes jeg har haft mange mislykkes forsøg…… men nu er jeg da lidt er på vej
Jeg skal nok lave en video, når jeg ”bare lige” har fået SX1509 til at virke (dvs. flere knapper), her skal der sikker også nogle forsøg til
Mvh
Lars LCS
Lars LCS
Indlæg: 10
Men du har stadig et loop, der hænger - det har du ikke løst endnu: Når du kalder en af dine funktioner, vender du ikke tilbage til dit loop(), før servoen er flyttet helt på plads.
Prøv at overveje, hvad der ville ske, hvis du bevarede programmet her (næsten) uændret - men flyttede delay(30) kaldet fra dine servofunktioner og tilbage til loop()?
Hej Lars
Jeg har prøvet at lægge delay tilbage i loopet, men det synes servo’en ikke om!
Den tosser bare frem og tilbage, hvis man trykker lyn hurtigt på knappen, kan man være heldig at den skifter til den nye position!
Kan godt se det uheldige i at bruge ”delay”, men mine evner rækker ikke længere lige pt
(
MvhLars LCS
Lars LCS
Indlæg: 10
Hej
Så er jeg kommet lidt videre i mit projekt, det har stået lidt stille pga. arbejde og julegaveindkøb
Har fået tilsluttet SX1509 til arduinoen, og lavet en prøve opstilling med 4 knapper.
Jeg har fundet dette program:
https://learn.sparkfun.com/tutorials/sx1509-io-expander-breakout-hookup-guide#example-button-matrices
så jeg kan aflæse mine input (knapper) på computerskærmen.
Så langt så godt, men jeg kan ikke finde noget program så omsætter mine input til handlinger!
Har selv prøvet af ”flette” noget sammen, men det er ikke lykkes mig at få noget til at virke
For at starte simplet så vil jeg ”bare” tænde og slukke for led 13, når det så virker vil jeg prøve at flette det sammen med TLC5940 med mine servo’er.
Kan nogen af eksperterne ”vise” vejen for mig med et program eller et link, omsætte input til handlinger?
Mvh
Lars LCS
Skott
Ingeniør
Indlæg: 1.939
Hej Lars
Nu ved jeg ikke, om jeg regnes som en af eksperterne :
Men jeg vil gerne prøve at give lidt fif, så du forhåbentlig kan komme lidt videre 
Det programeksempel. du linker til 'skanner' dit matrixkeyboard for at se hvilken tast, der er trykket på - denne bliver så gemt i variablen 'key' i denne linje: char key = keyMap[row][col];
Det vil sige, at key indeholder et tal mellem 0 og 255 (det kan variabler, når de er oprettet som typen char)
Som regel vil man gøre det, at man typisk giver, her key, en værdi, den ikke kan antage ved at trykke en tast, som regel 255. og så undersøge om værdien er forskellig fra dette tal - gøres ved at bruge kommandoen '!=' (forskellig fra).
Ex
if ( key != 255)
{
kode.....
}
Dette vil gøre, at indeholder key noget andet end tallet 255, vil den kode, der står mellem de to bløde parenteser blive udført. Dette kunne ex være kommandoen digitalWrite(13); Denne er så tændt, så længe key indeholder andet end 255.
Når du nu har et matrixkeyboard, vil jeg foreslå du, når dette virker prøver at kigge på det, som hedder en switch case
Med venlig hilsen
Skott
cruiser79
AV-Tekniker
Faaborg
Indlæg: 49
Hej Steen
Prøv at læse denne artikel på vores klubs hjemmeside (3modul) begået af Poul Erik...
http://www.3modul.dk/joomla256/index.php/tips-og-tricks/179-servo-sporsk...
Her styres 16 servoer/sporskifter af en RP2.
Måske det var noget du kan bruge...
Mvh
Kristian
Jeg har skrevet den artikkel Kristan henviser til. Løsningen anvender ikke ringetryk, men i stedet et web interface hvor jeg kan styre skifterne enten ved hjælp af mus eller en trykfølsom skærm. I artiklen anvender jeg en AdaFruit Servo Driver der kan kontrollere 16 servoer. Disse kan "stakkes" så det totale antal servoer, der kan styres via løsningen i min artikkel, er 256.
Servo Driveren er drevet fra an Raspberry P (via I2C)i. Denne (Pi'en) kører Linux og kan derved nemt programmeres til næsten hvad som helst. Den har et antal ind- og udgange, men ikke nok til at der er mulighed for at styre 160 servoer via ringetryk. Derfor valgte jeg at lave et program der via Apache udstiller en html side, hvorfra jeg kontrollerer servoerne.
Hej
Jeg har læst din artikkel igennem flere gange og sidder lidt fast i forhold til at lave hjemmesiden. Kunne det tænkes at du havde lyst til at hjælpe mig?
Jeg har sendt dig en privat besked også
vh Thomas