inlezen van data in arduino met shift register

Gestart door bumper, 28 december 2020, 10:41:54 AM

bumper

Wellicht is er onder jullie wel iemand die mij verder kan helpen.
Ik moet een 12 standen schakelaar inlezen in een arduino Uno.
Een zes standen schakelaar kan ik reeds inlezen met een CD4021B shift register en uitlezen met een 74HC595 shift register.
Een 12 standen schakelaar kan ik inlezen met twee 4021 IC's maar ik krijg de code niet werkende.
De code voor één shift register heb ik destijds van de arduino site gehaald. Maar voor twee shift registers vind ik op de arduino site geen oplossing. Ook mijn verdere zoektocht op het internet leverde niets op.
Let wel, ik kan arduino programmeren met zeer eenvoudige en basic instructies. Het mag dus niet te ingewikkeld zijn, want dan moet ik passen. Ik wil het ook kunnen begrijpen om eventuele problemen in de toekomst zelf te kunnen oplossen, kwestie van niet steeds iemand lastig te moeten vallen. Dus hogere programmeertalen zijn niet aan de orde denk ik.

Groeten.
Ludo.
 

Karel A.J.

#1
Ik ken die CD4021 niet, maar kan men die niet "daisy-chainen" net zoals de 595? Dan zou er aan de code niets moeten wijzigen, met enig geluk, behalve het aantal in te schuiven bitjes.

[edit:] lees ook eens op https://www.microchip.com/forums/m213347.aspx ; daar is er sprake van een 74HC165 als schuifregister, en die kan blijkbaar wel ge-daisychained worden. Ze spreken ook van een matrix, maar dat zal voor uw twaalfstandenschakelaar niet werken.

Een heel andere aanpak: men kan ook tussen de contacten van de schakelaar 11 (gelijke) weerstanden monteren, en de onder- en bovenkant met weerstandjes aan massa en voeding hangen. Nu krijgt men een analoge spanning afhankelijk van de schakelaarstand; inlezen met een a/d-ingang van de Arduino en Kees komt klaar.

bumper

Karel,

Kees komt misschien wel klaar, maar de Ludo niet.
Vooreerst "daisy-chainen" ken ik niet. Voor zover ik weet is een 74HC165 het omgekeerde van een 595. De een in serieel in en parallel out, de andere parallel in en serieel out denk ik.
Maar ik wil het met de 4021 en 595 oplossen daar de input en output printjes reeds gemaakt zijn.
Dank in ieder geval.

Ludo.
 

Karel A.J.

Ah, oei, printjes reeds geëtst? Kunt ge het schema posten?

Overigens: met die analoge oplossing die ik suggereerde (maar niet zelf heb uitgevonden!) is er helemaal geen printje nodig, alleen wat weerstandjes op en rond de schakelaar solderen, en enkele draadjes naar de Arduino (of het printje waarop hij staat). Niet dat het echt moet voor mij, maar bekijk het toch eens? Staar u niet blind op de printjes, ja die zijn dan verloren, maar als de eindoplossing simpeler en goedkoper is en voldoende betrouwbaar, dan is het nog altijd een betere oplossing.

Peter_66

Zonder schema wordt het moeilijk.
Programma is ook handig om te zien waar het mis gaat.

Havoc

Een cd4021 kan je daisy-chainen. Daisy-chainen is verschillende van dezelfde ic's achter elkaar zetten zodat die zich gedragen als 1 ic van hetzelfde soort maar dan (in dit geval) meer ingangen. Nu of dat mogelijk is met jouw printjes dat gaan we alleen kunnen zeggen als we het schema zien. Dan gaan we kunnen zeggen of het kan, hoe je de boel moet verbinden en dan kunnen we aan het programma beginnen denken wat daar fout loopt.
Met vakantie voor onbepaalde duur.

bumper

#6
Johan,
Bijgaand de nodige informatie.
De eerste twee afbeeldingen zijn de schema's. Deze komen van de arduino website, dus ik veronderstel dat die juist zijn.
De volgende twee afbeeldingen zijn van de printjes. Deze zijn wel gemaakt voor enkelvoudig gebruik maar met enkele bijkomende verbindingen kunnen die wel gebruikt worden.
De laatste afbeelding is de sketch die werkt voor enkelvoudig gebruik. Ik dacht dat het voldoende was om de loop functie aan te passen van 7 naar 15, maar dat werkt niet. Waarschijnlijk is er nog bijkomende code nodig. Dit is ook het geval voor de output denk ik.
De bovenstaande schakeling heb ik gebouwd met schakelaars en ledjes op experimenteer printjes om te kunnen testen.






Ludo
 

bumper

Probleem, blijkbaar zijn mijn afbeeldingen niet zichtbaar.
Wat heb ik nu weer fout gedaan?
 

Karel A.J.

De prentjes zijn hier wel zichtbaar hoor! Weliswaar zijn ze niet bijzonder scherp, het kost me nogal moeite om bv. te lezen welke pin van de 4021 wat doet of betekent. Het is nu ook nogal laat voor mijn doen, maar ik bekijk het morgen wel.

bumper

Bij mij zijn ze niet zichtbaar.
Geen idee hoe dat komt.
Hulp is noodzakelijk.

Ludo.
 

darick69

#10
ander mogelijke oplossing,... (ik zie dt er reeds een vermelding hierover bestaat ..)
met mijn beperkte kennis zou ik toch een analoge ingang te gebruiken,.. keep it simple..
ik heb reeds zo'n test gedaan om 4 aparte schakelaars in te lezen op 1 ananloge ingangspoort. De schakelaars geven elk een spanning tss 0 en 5V

S1  tss 0 en 1,25 V
S2  tss 1,25 en 2,5 V
S3 tss 2,5 en 3,75V
S4 tss 3,75 en 5V

de arduino zal respectievelijk een bit of led aansturen als de spanning tss deze waardes zit.(hier waren dit 4 leds)

als je dit nu in een 12 stappenbereik omzet moet dit toch lukken,,  het vraagt wel wat berekening om de juiste weerstandswaardes te bepalen maar moet lukken.   bv   hoe hoge de schakelaar hoe hoger de ingangsspanning...  ( soort potmeter....)   
Met een minimum aan componenten (alleen weerstanden) moet dit lukken zonder ingewikkelde hardwaretruken.
ge hebt hier dus 1 ingang en 12 uitgangen van Arduino UNO of NANO nodig,   moet dus lukken :-)

en anders een ARDUINO MEGA als ge heel veel ingangen wilt...

mvg

Erik



 

doomslu

Citaat van: bumper op 28 december 2020, 22:46:10 PM
Probleem, blijkbaar zijn mijn afbeeldingen niet zichtbaar.
Wat heb ik nu weer fout gedaan?
Bij mij zijn ze wel zichtbaar.
Het probleem is gekend en al besproken hier. De plaatjes staan op een server zonder SSL-certificaat (te zien aan de http in het adres, in plaats van https).
Wie op dit forum beelden wil zien die op een dergelijke server staan moet dit daarvoor in de instellingen van zijn browser instellen.
luc    * MODEL RAILROADING IS FUN *

bumper

Luc,
Ik gebruik de server van telenet.
Moet ik misschien gewoon de "s" toevoegen bij het plaatsen van beelden in mijn bericht?

Ludo.
 

bumper

Karel,
Hierbij de pinconfiguratie volgens de data sheets.
IC 4021:
Pin 1:PI-8 / Pin 2:Q6 / Pin 3:Q8 / Pin 4:PI-4 / Pin 5:PI-3 / Pin 6:PI-2 / Pin 7:PI-1 / Pin 8:Vss / Pin 9:Parallel-Serial control / Pin 10:Clock
Pin 11 :Serial In / Pin 12:Q7 / Pin 13:PI-5 / Pin 14:PI-6 / Pin 15:PI-7 / Pin 16:Vdd
IC 595:
Pin 1:QB / Pin 2:QC / Pin 3:QD / Pin 4:QE / Pin 5:QF / Pin 6:QG / Pin 7:QH / Pin 8:GND / Pin 9:SQH / Pin 10:Reset / Pin 11:Shift Clock
Pin 12:Latch Clock / Pin 13:Output Enable / Pin 14:A (Serial Data Input) / Pin 15:QA / Pin 16:Vcc

Verder mannen ik weet dat er een Mega bestaat, maar die moet ik gaan kopen, de rest heb ik hier liggen.
Het systeem met een 4021 en een 595 werkt bij mij perfect op mijn baan voor het aansturen van mijn schaduwstation.
Mijn standenschakelaar kan ik rechtstreeks op de 4021 aansluiten, dus geen gedoe met weerstanden solderen en berekeningen maken
wat voor mij (amateurke) toch een voordeel is vind ik, en omdat er een aantal onderdelen al voorbereid zijn. En ook omdat ik via de 595 met 3 uitgangen 8 leds kan sturen.
Omdat ik nu omwille van enkele aanpassingen aan de baan enkele pinnen te kort kom wil ik het toch op deze manier oplossen.
Hoe doe ik het nu : ik lees de stand van mijn keuzeschakelaar (welke overeenkomt met het gekozen spoor nummer max 8 dus) in met de 4021. Deze Byte bevat dus één "1", daar zoek ik de plaats van op om via een subroutine de wissels te sturen. Deze byte stuur ik ook naar de 595 dewelke er voor zorgt dat via een relais de spanning op het spoor komt en een indicatie led laat branden. Dit systeem werkt perfect, heb ik onder de knie en zou graag hierop verder borduren.
Maar dit wil niet zeggen dat ik jullie voorstellen zomaar in de prullenbak gooi. Neen, ik neem ze wel mee om eventueel te gebruiken bij een volgend project, want ik moet nog heel wat automatiseren.
Bedankt voor jullie inbreng.

Ludo. 
 

raf




en waarom moeilijk doen als het ook gemakkelijk kan
ok geen raduino maar picbasic

een processor blijft een ding met o en 1 dus dit kan ook werken op een arduino
blijft alleen het programmeren
ps in basic werkt het tot 20 knoppen en ik weet het want ik heb dit zo werken

Vergeet niet die 220k weerstand over de condensator van 100n te plaatsen, anders werkt het niet.


DEVICE 16F628A                ;Gebruik een 16F628A type
CONFIG INTRC_OSC_NOCLKOUT, WDT_OFF, PWRTE_ON, LVP_OFF, MCLRE_OFF
ALL_DIGITAL TRUE              ;Alle ingangen digitaal

;Logische constanten
SYMBOL AAN          = 0       ;Geinverteerd AAN
SYMBOL OFF          = 0       ;UIT
SYMBOL ON           = 1       ;AAN

;Poortnamen
SYMBOL Toets        = PORTA.1 ;Toetsen zitten aan PORTA.1 via een weerstandsnetwerk
SYMBOL LED_Groen    = PORTA.2 ;De groene LED zit op PORTA.2 aangesloten
SYMBOL LED_Rood     = PORTA.3 ;De rode LED zit op PORTA.3 aangesloten

;Variabele declareren
DIM Weerstand AS WORD         ;WORD variabele, bevat straks waarden van de toetsindrukken

;        76543210
PORTA = %00000000             ;Opstarten met alle PORTA uitgangen uit (laag)
TRISA = %11110011             ;PORTA.3 en PORTA.2 omschakelen als uitgang voor de LED's

CLEAR                         ;Wis alle RAM geheugen
DELAYMS 500                   ;LCD stabilisering


;Hoofdprogramma
CLS                           ;LCD scherm wissen

WHILE 1 = 1                   ;Oneindig door blijven meten
  IF Toets = AAN THEN         ;Als er op een toets wordt gedrukt dan...
    PRINT AT 1, 1, "Toets "   ;Zet het woordje 'Toets' alvast op de eerste display regel

    HIGH Toets                ;Condensator ontladen
    DELAYMS 1                 ;Even wachten zodat condensator helemaal leeg is
    Weerstand = RCIN Toets, HIGH ;Geef RC oplaadtijd aan WORD variabele 'Weerstand'

    IF Weerstand < 31 THEN       ;Toets 1 ingedrukt dan...
      LED_Groen = OFF            ;...beide LED's uit
      LED_Rood  = OFF
      PRINT "1"                  ;Zet het toetsnummer achter 'Toets' op het display
    ELSEIF Weerstand < 94  THEN  ;Toets 2 ingedrukt dan...
      LED_Groen = LED_Groen ^ 1  ;...toggle de groene LED
      PRINT "2"                  ;Zet het toetsnummer achter 'Toets' op het display
    ELSEIF Weerstand < 159 THEN  ;Toets 3 ingedrukt dan...
      LED_Rood  = LED_Rood ^ 1   ;...toggle de rode LED
      PRINT "3"                  ;Zet het toetsnummer achter 'Toets' op het display
    ELSEIF Weerstand < 228 THEN  ;Toets 4 ingedrukt dan...
      LED_Groen = ON             ;...beide LED's aan
      LED_Rood  = ON
      PRINT "4"                  ;Zet het toetsnummer achter 'Toets' op het display
    ELSEIF Weerstand < 300 THEN  ;Toets 5 ingedrukt dan...
      LED_Groen = ON             ;...de groene LED aanzetten
      PRINT "5"                  ;Zet het toetsnummer achter 'Toets' op het display
    ELSEIF Weerstand < 999 THEN  ;Toets 6 ingedrukt dan...
      LED_Rood  = ON             ;...de rode LED aanzetten
      PRINT "6"                  ;Zet het toetsnummer achter 'Toets' op het display
    ENDIF

    PRINT AT 2, 1, DEC5 Weerstand;Zet waarde van 'Weerstand' op regel 2 van het display

    WHILE Toets = AAN : WEND  ;Wacht hier tot toets(en) wordt losgelaten
  ENDIF
WEND                          ;Terug naar WHILE

If I make mistakes in "spelling"
Remember it's the pen, that's bad
Don't lay the blame on me.