Picture

tøf tøf

glasgrossist, glarmester, og drivhusproducent

Vemmelev

Indlæg: 347

PB  Hjemmeside

sportavle..

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..

Like 0 kan lide
Top

Picture

je

Egå

Indlæg: 129

PB

Lars LCS skrev:

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

Like 0 kan lide
Top

Picture

Lars LCS

Indlæg: 10

PB

Skott skrev:

Hej Lars

Velbekom. Håber, det kommer til at virke for dig. Glæder mig til at høre om dine erfaringer Smile

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 Smile 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 Smile

Mvh

Lars LCS

Like 0 kan lide
Top

Picture

Lars Skjærlund

Rødovre

Webmaster

Indlæg: 4.101

PB  Blog  Hjemmeside

Bravo! Smile

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

Like 1 kan lide
Top

Picture

Skott

Ingeniør

Indlæg: 1.918

PB

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 Smile

__________________

Med venlig hilsen

Skott

Like 0 kan lide
Top

Picture

Lars LCS

Indlæg: 10

PB

Lars Skjærlund skrev:

Bravo! Smile

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 Wink

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 == Innocent {
    //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

Like 0 kan lide
Top

Picture

Lars Skjærlund

Rødovre

Webmaster

Indlæg: 4.101

PB  Blog  Hjemmeside

Da' Lars.

Lars LCS skrev:
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?

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

Like 0 kan lide
Top

Picture

Lars LCS

Indlæg: 10

PB

Skott skrev:

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 Smile

 

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 Smile

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 Wink

 

Mvh

Lars LCS

 

Like 0 kan lide
Top

Picture

Lars LCS

Indlæg: 10

PB

Lars Skjærlund]</p><p>[quote=Lars LCS skrev:

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 Sad(

MvhLars LCS

 

Like 0 kan lide
Top

Picture

Lars LCS

Indlæg: 10

PB

Hej

Så er jeg kommet lidt videre i mit projekt, det har stået lidt stille pga. arbejde og julegaveindkøb Smile

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 Puzzled

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

Like 0 kan lide
Top

Picture

Skott

Ingeniør

Indlæg: 1.918

PB

Hej Lars

Nu ved jeg ikke, om jeg regnes som en af eksperterne  :Cool Men jeg vil gerne prøve at give lidt fif, så du forhåbentlig kan komme lidt videre Smile

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

Like 0 kan lide
Top

Picture

cruiser79

AV-Tekniker

Faaborg

Indlæg: 49

PB

PoulErik skrev:

HP 16 skrev:

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å Smile

 

vh Thomas 

 

 

 

Like 0 kan lide
Top

Kommentarvisning

Vælg din foretrukne kommentarvisning og klik på "Gem indstillinger" for at aktivere dit valg.