Go Down

Topic: film digitaliseren met eenvoudige Arduino-code (Read 936 times) previous topic - next topic

keithjansen

Jan 01, 2021, 02:48 pm Last Edit: Jan 04, 2021, 01:04 pm by keithjansen
Ja hoi,

 ' ben bezig met een telecine project met een Eumig filmprojector (Eumig 501 dual S) waarvan ik de originele motor m.b.v. wat handig toegepaste Mecano-reepjes heb vervangen door een NEMA 12v steppermotor die ik met de motordriver erbij, zélf heb bedraad én lopend heb gekregen :)  Een aparte digitale camera fotografeert dan de afzonderlijke filmbeeldjes


Alleen moet de centrale projector-as, om elk afzonderlijk filmbeeldje te kunnen fotograferen, een volmaakte omwenteling van 360 graden maken en met met het opgeven van een aantal steps in de Arduino code lukte dat bijna maar net niet helemaal  Bijv vanwege slip van de snaar tussen de steppermotor-poelie en de centrale as van de projector of door andere mechanische invloeden en dan loopt de sluiter van de projector (de "vlinder") op de duur voor of achter op het moment dat deze sluiter het licht van de LED moet doorlaten naar het filmbeeldje en deze op de duur dan ook half of helemaal donker laat...


ik ben dus aangewezen op een switch - btw dat kan een microswitch zijn of een reedswitch (Hall switch zou ook nog kunnen?) - die de steppermotor even laat stoppen na de projectoras precies 360 graden te hebben laten draaien om ná het filmtransport en met de sluiter open de digitale camera het volgende filmbeeldje te kunnen laten fotograferen

alleen, zo'n switchje is fysiek zo geinstalleerd máár... hoe programmeer en vooral, hoe bedraad je je zoiets???, ik heb al een hele hoop Arduino code gevonden in mijn richting maar er staat vrijwel NERGENS bij hoe je de boel dan bedraad en ik wil mijn Arduino (uno) niet meteen opblazen natuurlijk :o

kortom, wie heeft een clue of en/of hint? al was het alleen maar om een drukknopje zoals een switch te programmeren en vooral! hoe zoiets te bedraden...

Met vriendelijke groet,

kees

Erik_Baas

Het aansluiten van een schakelaartje is simpel: tussen een I/O-pin en massa. In de sketch zet je de betreffende pin op INPUT_PULLUP en je leest 'm uit met digitalRead(switchPin).

Code: [Select]

byte switchPin = 2; // bijvoorbeeld, mag elke GPIO pin zijn

void setup() {
  pinMode(switchPin, INPUT_PULLUP);
}

void loop() {
  if (digitalRead(switchPin) == LOW) {
    // hier de code om de aandrijving te stoppen
  }
}


Maar, omdat timing hier erg belangrijk is, moet je misschien je toevlucht nemen tot het gebruik van een interrupt, vooral als de Arduino ook nog andere dingen moet doen. Maar probeer het eerst eens op deze manier?

keithjansen

Ja hoi Erik, alvast bedankt voor het meedenken en je idee!

alleen... als beginner snap ik bijna niks van je code  :smiley-confuse: , maar ik ben wel net bezig geweest uit te vinden hoe je een drukknop programmeert (en bedraad!) en dat werkt al (waar die weerstand precies voor is is me een compleet raadsel maar goed, dat komt later wel, al doende leer ik 8) )

bijgaand zie je de code waarmee m'n steppermotor (NEMA 17) werkt, als jij me vertelt waar precies ik de regels voor de microswitch neerzet (en hoe ik die bedraad met m'n breadboard) ben ik alweer een stuk verder :)

en oh ja, nadat de switch m'n steppermotor heeft gestopt voor de 2 seconden pauze moet die motor wel weer gaan lopen na 2 of 3 seconden, hoe doe ik dat dan ondanks dat de switch op dat moment nog op "aan" staat?

Mvg,

kees

p.s. ik hoef geen professor summa cum laude in de Arduino-code te worden, ik wil de Arduino alleen maar gebruiken om het film digitaliseren te laten werken, wat ik er gaandeweg van leer is dan wel mooi meegenomen :smiley-wink:

Koepel

Kijk eens naar BasOnTech: https://arduino-lessen.nl/.
Scroll iets naar beneden voor de beginnerslessen.
Dit is de les over een drukknop: https://www.youtube.com/watch?v=HKh-zfgpzGM

keithjansen

#4
Jan 02, 2021, 10:44 am Last Edit: Jan 02, 2021, 10:49 am by keithjansen
 Ehh, die drukknop les heb ik natuurlijk al gedaan! :) (zie boven, antwoord aan Erik) geen gebrek aan inzet van mijn kant hoor!  En die beginnerslessen zijn ook prima maar er staat heel vaak geen schema bij hoe je een en ander dan bedraad op je breadboard en moet je er maar naar raden, dat kan link zijn voor de hardware dus dat vind ik wel een opvallend min-punt van Arduino (voor beginners dan...)


blijft mijn probleem dat ik de volgorde voor code-regels voor de microswitch en het draaien van de steppermotor in de void setup al niet eens weet laat staan hoe ik in de void loop dan een if then constructie of weet ik wat toepas, het moet uiteindelijk heel eenvoudig zijn maar kom er maar eens op... (zucht)

nog maar eens de voorwaarden voor het Arduino programmaatje:


1: steppermotor in filmprojector lopen

2: bij aanraken microswitch in de door steppermotor aangedreven filmprojector (= van microswitch-toestand 0 naar 1) motor stoppen

3: motor paar seconden niet lopen (voor maken foto filmbeeldje)

4 motor lopen

enz enz


Volgens mij is dit ook een daadwerkelijke "loop"


(Alleen staat de microswitch dan wsch nog op 1, hoe los je dat dan op??)



Er zijn hier vast wel slimpies die dit voor elkaar krijgen en het hoeft ook niet in één keer goed


Mvg,


kees

shooter

jouw stepper library is een blocking code ofwel hij doet dus bijvoorbeeld 200 stappen en dan gaat het programma verder. dat is niet slim, om even simpel te houden:
zet een stap met je motor ofwel zet je uitgangen goed, dat ligt een beetje aan wat voor driver ertussen zit zoals een L293 of een A4988 zijn erg verschillend.
kijk dan of het beeldje goed is waarschijnlijk niet en dus zet je weer een stap enz tot het beeldje goed is. dat kan het beste door te kijken of je door een tandje van de film heen kan kijken. maak dan een foto en draai dan verder. misschien moet je wel eerst even 200 stappen zetten en dan pas gaan kijken dan wordt het een stuk sneller.
tussen elke stap even wachten met delay want anders zet je 1 miljoen stappen per seconde en dat gaat niet.
als dit werkt kun je gaan kijken naar accelstepper die kan versnellen en vertragen etc.
Maar je bent goed bezig en je constateert ook precies waar het probleem ligt, ofwel laat het aantal stappen los en zoek naar een detectie,
paul deelen
shooter@home.nl
making controls with codesys PLC and arduino

MAS3

#6
Jan 02, 2021, 01:02 pm Last Edit: Jan 02, 2021, 01:33 pm by MAS3
Ik weet niet wat Bas je voorschotelt, maar dit is het allereerste wat je te zien krijgt in de Button.ino voorbeeld sketch.

Code: [Select]
/*
  Button

 Turns on and off a light emitting diode(LED) connected to digital
 pin 13, when pressing a pushbutton attached to pin 2.


 The circuit:
 * LED attached from pin 13 to ground
 * pushbutton attached to pin 2 from +5V
 * 10K resistor attached to pin 2 from ground

 * Note: on most Arduinos there is already an LED on the board
 attached to pin 13.


 created 2005
 by DojoDave <http://www.0j0.org>
 modified 30 Aug 2011
 by Tom Igoe

 This example code is in the public domain.

 http://www.arduino.cc/en/Tutorial/Button
 */


Heel veel duidelijker kan ik het me niet voorstellen.
De commentaren staan er niet voor niets, en het is wel de bedoeling dat dat gelezen en begrepen word.
Zou je dat overslaan, mis je dus informatie, en bij de voorbeelden die je bij de IDE krijgt zeer zeker.


[edit]
Overigens is dit voorbeeld een van de eerste voorbeelden die je tegen zou moeten komen.
Daarom is 'ie zo eenvoudig mogelijk te begrijpen gehouden.
Je kunt een drukknop of schakelaar ook zonder externe weerstand gebruiken.
Daarvoor moet je in je sketch instellen dat je een interne weerstand wil gebruiken, maar die werkt precies andersom als de externe weerstand in dit voorbeeld.
Daarom moet je dan ook niet kijken of er een HIGH ontstaat bij het bedienen van de knop, maar een LOW.
Dat gaat een beetje tegen de intuïtie in, en kan daarom verwarrend zijn en das dan weer de reden dat er hier wel voor een externe weerstand is gekozen.
[/edit]
Have a look at "blink without delay".
Did you connect the grounds ?
Je kunt hier ook in het Nederlands terecht: http://arduino.cc/forum/index.php/board,77.0.html

keithjansen

#7
Jan 02, 2021, 03:34 pm Last Edit: Jan 02, 2021, 05:09 pm by keithjansen
 Ehh, Shooter hierboven zei: "jouw stepper library is een blocking code ofwel hij doet dus bijvoorbeeld 200 stappen"?

Hoe dan ook, ik gebruik de stepper library die met de Arduino.exe installatie wordt meegeleverd (er staat iets met stepper.h in de code) heeft dat maar 200 stappen dan?  Kun je zo'n stappenmotor niet laten ronddraaien zónder vooraf opgegeven stappen? zodat ie alleen maar wordt onderbroken door de micro-switch en de daarbij behorende code? en dan weer doorloopt?...

 (Weet je, ik kan ook wel een kant en klaar film-digitaliseer-ding kopen van Reflecta maar dat kost 435 euro of zo en je hebt een resolutie van maar 1440 x 900 pixels :(  Mijn digitale camera haalt met gemak meer dan het dubbele dus dan ga ik liever even door want ik maak dingen graag af anders is alle voorgaande moeite ook voor niks geweest...)

btw, in de huidige opstelling projecteer ik het filmbeeldje met het projector-objectief direct op de sensor van de camera :)  Door een neutrale kleur filter heen dan om de sensor te beschermen

mvg ,

kees

Erik_Baas

Ik denk eerder dat het getal 200 alleen een voorbeeld was. Wat "blocking code" betreft: daar wordt mee bedoeld dat de microcontroller pas verder gaat met uitvoeren van de volgende regel code nadat (in dit geval) de stepper fysiek klaar is. Dat kan dus even duren, en intussen gebeurt er niets; signalen op een input kunnen daardoor verloren gaan.

MAS3

...hoe doe ik dat dan ondanks dat de switch op dat moment nog op "aan" staat?
(Alleen staat de microswitch dan wsch nog op 1, hoe los je dat dan op??)
Wanneer je aan die voorwaarde voldaan hebt, is die niet meer geldig, maar word de volgende voorwaarde geldig.
Ik denk dat de volgende voorwaarde dan is dat je gaat tellen tot de door jou gewenste stoptijd verlopen is.
Daarna ga je weer de motor in beweging brengen, maar dat is dan dus niet meer afhankelijk van het signaaltje (we gaan er nog maar even van uit dat dat nog steeds een switch is, is nu nog niet zo belangrijk).
Pas wanneer je gezien hebt dat de switch niet meer actief is, kun je gaan kijken of 'ie weer actief gaat worden.


Zoals anderen ook al gezegd hebben, je bent op de goede weg en denkt en handelt op een goede wijze.
Jouw stappen waarmee je je loop beschrijft zijn een prima werkwijze.
Maar het zijn best flinke stappen, en ik denk dat je er ook nog een paar mist.
Die missende stappen zijn gemakkelijk in de huidige stappen in te passen wanneer je ze gevonden hebt.
Je moet ze wel zelf bedenken want jij weet wat je precies wil en wij kunnen daar alleen maar naar raden.
De flinke stappen kun je ook nog eens nader bekijken.
Als je daar eens een paar keer over nadenkt, zul je vast zien dat je ze in nog kleinere (sub-)stapjes kunt hakken.
En dat waarschijnlijk nog een aantal malen.
Zo word je nog steeds geen professor, maar je denkt wel heel goed na over de processen die je wil (moet) doorlopen om je doel te bereiken.
En das nou juist het leuke aan de hobby wat mij betreft, je leert er van alles van (dus ook van de hobby die je al had in jouw geval).
Have a look at "blink without delay".
Did you connect the grounds ?
Je kunt hier ook in het Nederlands terecht: http://arduino.cc/forum/index.php/board,77.0.html

shooter

ja die 200 is een voorbeeld, veel stappenmotoren hebben 200 /omwenteling. en ja bij stepper die dus standaard bij arduino zit gaat gewoon de motor stappen tot het getal, en de UNO wacht net zolang tot de stappen gedaan zijn. Bij accelstepper is dat dus niet zo, maar telkens als een run komt kijkt de steppersoftware of het tijd is om een stap te doen.

paul deelen
shooter@home.nl
making controls with codesys PLC and arduino

keithjansen

#11
Jan 03, 2021, 01:02 pm Last Edit: Jan 03, 2021, 01:48 pm by keithjansen
Volgens mij ben ik er al dichtbij met deze gekregen code :) (dank je wel Frank H.) btw, hóe krijg je code in zo'n venstertje met schuifbalk?? :

zo dus :-)

Code: [Select]

/*
  Autheur:      Fun met Electronica
  Link:         https://training.funmetelectronica.nl/docs/arduino-basis/lessen/les-14-stappenmotor/ 
  Beschrijving: Stappenmotor aansturen
 
  Aansluiting stappenmotor:
    1n1 = pin 8
    1n2 = pin 9
    1n3 = pin 10
    1n4 = pin 11
    --  = gnd
    +5v = +5v
*/
 
/*
  Een library en een paar constantes definiëren
*/
#include <Stepper.h>
#define STAPPEN_PER_MOTOR_OMWENTELING 32
#define STAPPEN_PER_TOTAAL_OMWENTELING1 2048 // 64 x 32 = 2048 = 1 omwenteling rechtsom
#define STAPPEN_PER_TOTAAL_OMWENTELING2 -1024 // -1024 = 0.5 omwenteling linksom
 
Stepper small_stepper(
  STAPPEN_PER_MOTOR_OMWENTELING,
  8,
  10,
  9,
  11);                  // stapenmotor variabele
int knop1 = 1;          // knop aan pin 1
int knop2 = 2;          // knop aan pin 2
int toestandknop1 = 0;  // knop1 variabele
int toestandknop2 = 0;  // knop2 variabele
int  TeMakenStappen;    // variabele voor aantal stappen
 
/*
  Het programmablok void setup wordt eenmaal beschreven
*/
void setup(){
  pinMode(knop1, INPUT);  //knop1 is input
  pinMode(knop2, INPUT);  //knop2 is input
}
 
/*
  Het programmablok void loop herhaalt zich keer op keer
*/
void loop(){
  toestandknop1 = digitalRead(knop1);                     // lees toestand knop1
  toestandknop2 = digitalRead(knop2);                     // lees toestand knop2
  if (toestandknop1 == HIGH) {
    TeMakenStappen  =  STAPPEN_PER_TOTAAL_OMWENTELING1 ;  // draai 1x rechtsom
    small_stepper.setSpeed(500);                          // zet de snelheid
    small_stepper.step(TeMakenStappen);                   // loop
  }else if (toestandknop2 == HIGH) {
    TeMakenStappen  =  STAPPEN_PER_TOTAAL_OMWENTELING2 ;  // draai 0,5 keer linksom
    small_stepper.setSpeed(500);                          // zet de snelheid
    small_stepper.step(TeMakenStappen);                   // loop
  }
}
 
/*
  Opdracht 1:
  Kom erachter wat er precies in de code gebeurd.
  Zoek op internet wat de stepper library heeft.
  Probeer een paar dingen te veranderen of toe te voegen.
*/


als ik de code van pin 1 op niet actief zet met "//" en van pin 2 het aantal te maken stappen op 0 zet ben ik er volgens mij ook erg dichtbij 8) maar o wee, er moet ook nog ergens een "delay" van 3 seconden in... wat nu? :smiley-draw:



kortom, alle goede dingen komen langzaam :smiley-confuse:



mvg,


kees


Erik_Baas

hóe krijg je code in zo'n venstertje met schuifbalk?? :
Door er code-tags omheen te zetten: selecteer de code en klik op het "</>"-knopje.

Wat je delay betreft: op welk moment wil je die precies invoegen?

keithjansen

#13
Jan 03, 2021, 01:44 pm Last Edit: Jan 03, 2021, 03:25 pm by keithjansen
 Ehh, onmiddelijk nadat de microswitch de steppermotor heeft doen stoppen Erik :)

Mvg,

kees

keithjansen

#14
Jan 03, 2021, 03:26 pm Last Edit: Jan 03, 2021, 04:00 pm by keithjansen
UPDATE UPDATE UPDATE!!

laatst vermeldde schema net bedraad en geüpload en het werkt!

knop 1 laat stepper motor 2048 stappen rechtsom lopen en

knop 2 laat steppermotor 48 stappen linksom lopen (aantal stappen door mij aangepast om verschil te zien)

een en ander houdt in dat ik de code voor zowel de knoppen als voor de steppermotor werkend heb kunnen combineren in één complete code!  Ons bent blij!  :) want weer een "step" verder jaja

nou die pauze nog :smiley-confuse: ...

en die microswitch nog even in de projector frommelen, (ik denk dat ik toch maar zo'n Velleman reed  dingetje koop:   https://www.okaphone.com/artikel.asp?id=484585   die is net wat makkelijker te positioneren

Mvg,

kees


P.S.

uh-oh

knop 2 (1024 stappen counterclockwise) werkt niet zolang knop 1 niet klaar is m.a.w. knop 2 beinvloed knop 1 NIET door bijv. meteen de andere kant op te draaien

hoe laat ik de steppermotor sowieso lopen (met of zonder knop 1, dat geeft verder niet) en knop 2 de steppermotor meteen laten stoppen met een pauze er achteraan? en de loop dan weer van voren af aan?

Vertelll!!! jullie kunnen het!!! :-)



 

Go Up