10-tangenters matris till 2 pins buss (köksbordsbyggarnivå

Elektronikrelaterade (på komponentnivå) frågor och funderingar.
Användarvisningsbild
Greensilver
Inlägg: 1305
Blev medlem: 21 januari 2005, 21:24:57
Ort: Sverige
Kontakt:

10-tangenters matris till 2 pins buss (köksbordsbyggarnivå

Inlägg av Greensilver »

För ett tag sedan köpte jag några 10 knappars "telefontangentbord" av en kille på Tradera. Nu tänkte jag pilla ihop en modul som skall kunna användas när man enkelt vill koppla in ett tangentbord till något uC-bygge. Min tanke är att bygga en fristående enhet som skall bestå av tangentbordet och lämplig uC där man endast behöver ge matningsspänning in och sedan kan ta ut data enligt ett eget protokoll via två pinnar. Detta betyder att när man vill använda sig av modulen tar den enbart två pinnar i anspråk av bygget. Jag tänkte också att modulen skall fungera som en keyboardbuffer så att den lagrar tangenttryckningarna tills dess att mottagaren är redo att läsa. Mjukvaran tänkte jag skriva i C (Programmers Notepad), hårdvaran är jag däremot lite osäker på. Helst skulle jag vilja använda ATTiny22 av den anledningen att jag har en drös sådana ligger.

Min fråga då:
Hur läser man smidigast av en tangentbordsmatris enligt nedanstående schema.
Bild

EDIT:
Gjorde bilden lite mindre. Kan också tillägga att det inte finns några knappar för * och #. Dock sitter det en gummituta under täcklocken så det skall nog gå att använda dom ändå.

Större bild finns här:
http://www.greensilver.com/pic/elektron ... ntbord.jpg
Tekko
Inlägg: 9009
Blev medlem: 28 november 2004, 20:19:15

Inlägg av Tekko »

Gummituta :?:

Det luktar kodlås/larm om detta projekt, vad ska det bli exakt ?
Användarvisningsbild
MadModder
Co Admin
Inlägg: 31458
Blev medlem: 6 september 2003, 13:32:07
Ort: MadLand (Enköping)
Kontakt:

Inlägg av MadModder »

Genom att koppla upp tangentbordet i en motståndsmatris, så kan du få ut ett unikt motståndsvärde för varje tangent, och av detta bygga en spänningsdelare, och läsa av resultatet med en ADC-kanal.

Koppla kolumnerna 1, 2 och 3 (4,3,6) via 1k, 2k och 4k till VCC.
Koppla raderna 1, 2, 3 och 4 (9,8,7,5) via 8k, 16k, 32k och 64k till ett motstånd på 64k vidare till jord.
Ovanför sista 64k-motståndet plockar du ut 10 olika spänningar. :)

Anslutning 2 kan du ju då skippa helt.
Användarvisningsbild
Greensilver
Inlägg: 1305
Blev medlem: 21 januari 2005, 21:24:57
Ort: Sverige
Kontakt:

Inlägg av Greensilver »

Tekko:
Ja, under plasttangenterna sitter ett gummimembran med något ledande material som vid nedtryckning sluter mellan ledningsbanorna. På de ställen där det inte finns några tangenter sitter bara täcklock, under dessa finns dock "gummitutor", alltså gummimembranet synligt så för vanliga hemmabyggen kan man säkert utnyttja även blindknapparna om man använder en penna eller något för att trycka ned gummimembranet.

Inget kodlås eller larm, bara en modul för att lätt kunna plocka in ett tangentbord till ett bygge - särskilt under utvecklingsstadiet. Det kan ju gälla att man vill testa olika fördröjningar för loopar eller andra värden. Byggde för ett tag sedan en manick för att testa några RGB dioder jag kommit över. Då använde jag tre tryckknappar och en LCD display från Sodjan för att ställa in olika styrka på de respektive färgerna. Det var dock rätt trist att sitta och hålla inne knappen i typ en minut för att ställa in olika värden - var gött sugen på att ha ett tangentbord då men hade inte pinnar eller tid att implementera det.

Nu har jag dock fått lite hobbytid över så då tänkte jag att ett sånt här projekt kunde vara bra att bygga eftersom man kan ha nytta av det i senare byggen.

MadModder:
Ok, ADC kanal - analog till digital converter eller? Sådan finns ju inbyggd i vissa uC. Skall kika lite på sammanställningen på Elfas hemsida. Kanske har jag någon uC med en sådan inbyggd, om inte kanske det blir billigare att beställa en AD omvandlare och sen läsa den binärt?
Användarvisningsbild
Greensilver
Inlägg: 1305
Blev medlem: 21 januari 2005, 21:24:57
Ort: Sverige
Kontakt:

Inlägg av Greensilver »

Nu har jag kikat lite och det visade sig att jag hade en AT Tiny 15L som har en inbyggd AD omvandlare. Nu blir det till att läsa datablad ikväll så kanske jag kan börja bygga lite imorgon. Blir till att starta en projekttråd kanske. Eller är detta inte tillräcklig avancerat? :oops:


Tack för alla tips! :)
monstrum
Inlägg: 620
Blev medlem: 13 januari 2005, 05:38:32
Ort: Göteborg

Inlägg av monstrum »

Jag är mer lagd åt det digitala hållet. Om du dessutom har en hel uC att dedikera (minus två "com"-pinnar) så skulle jag rekommendera att koppla det så som det är tänkt. Med andra ord, som rader och kolonner.

Du drar på interna pull-up:erna på ingångarna (som är kopplade till 9,8,7,5), sedan "scannar" du igenom alla kolonnerna (genom att lägga hög signal på alla utgångar [2,4,3,6] utom en där du istället lägger låg nivå. Nu kollar du vilka ingångar som är sänkta och sparar undan detta någonstans.
Sedan byter du till nästa kolonn och återupprepar osv.


Lite kod kan kanske hjälpa:

Anta att raderna är kopplade till de fyra höga pinnarna på en port och kolonnerna är kopplade till de fyra låga.

Lite slöseri på minne. Går ju att optimera men principen är ju samma.

Kod: Markera allt

char keystatus[4][4];   // Knapparnas status, slöseri, men det går snabbt och är enkelt
char coltemp;   // Temporär status för nuvarande kolonn

DDRX = 0xF0;   // Ställ in ut- och ingångar
PORTX = 0xFF;   // Alla pull-ups igång

char outmask = 0x80;
for( char i=0; i<4; i++ ) {
  PORTX = ~(outmask);    // Låg signal på en av raderna
  
  coltemp = PINX;     // Läs in kolonnen
  char inmask = 0x01;
  for( char j=0; j<4; j++ ) {
    if(!(coltemp & inmask) ) {  // Maska bort allt utom nuvarande knappen, låg signal => knappen tryckt
      keystatus[i][j] = 1;
    }
    else {
      keystatus[i][j] = 0;
    }
    inmask <<= 1;  // Byt till nästa knapp i kolonnen
  }
  
  outmask >>= 1;  // Byt till nästa rad
}
Har inte testat detta, men det borde fungera. Kanske är någon liten bug, och man får hålla tungan i rätt mun när man kopplar in port-pinnarna så att status för knappen längst upp till vänster (a.k.a knapp 1) verkligen hamnar i keystatus[0][0] osv.

Edit: Fixade ett uppenbart fel i koden... och ett till
Användarvisningsbild
Hedis
Inlägg: 2493
Blev medlem: 8 december 2003, 15:10:44
Ort: Vänersborg
Kontakt:

Inlägg av Hedis »

Tiny15 har tyvärr inte överdrivet mycket pinnar (8-pins kapsel)
Så att köra med spänningsdelning och AD`n är nog den bästa lösningen.
Användarvisningsbild
Greensilver
Inlägg: 1305
Blev medlem: 21 januari 2005, 21:24:57
Ort: Sverige
Kontakt:

Inlägg av Greensilver »

Tack för koden monstrum! Hade lite huvudbry när jag skulle klura ut hur det var meningen att man skulle polla alla dessa kolumner och rader, ditt kodexempel sparas för framtida referens! :)

Att jag vill köra med en så liten uC är för att jag är lite snål, nädå men det är ju alltid bra att köra med prylar man redan har hemma eftersom det bara är på hobbynivå. Dessutom upplever jag det som lättare att leka med de mindre uC eftersom de inte är så über-avancerade. Blir lite lättare att få en överblick över dom så att säga. Detta blir mitt första projekt med ADC. Har aldrig grejat med det tidigare så det skall bli intressant. :D
Användarvisningsbild
JimmyAndersson
Inlägg: 26578
Blev medlem: 6 augusti 2005, 21:23:33
Ort: Oskarshamn (En bit utanför)
Kontakt:

Inlägg av JimmyAndersson »

"bara en modul för att lätt kunna plocka in ett tangentbord till ett bygge - särskilt under utvecklingsstadiet. Det kan ju gälla att man vill testa olika fördröjningar för loopar eller andra värden."

Greensilver: Har också byggt en sådan. :) Hela numeriska delen från ett tangentbord med motstånd till *en* analog ingång på en PIC-krets. Det fungerar perfekt när man vill justera värden och testa olika projekt. Tangenterna och LCD-displayen sitter nu monterade brevid nätagget. Har även monterat dit två potentiometrar. Nästa steg blir en liten ramp med lysdioder och knappar så man snabbt och enkelt kan koppla dessa till labbplattan när det behövs.
Användarvisningsbild
Greensilver
Inlägg: 1305
Blev medlem: 21 januari 2005, 21:24:57
Ort: Sverige
Kontakt:

Inlägg av Greensilver »

Sådant är ju guld! Tänk att bygga en utvecklingsstation med inbyggt tangentbord, nätagg, lysdiodsramp, pulsgivare, LCD med mera... Vore ju kanonbra. :D
Användarvisningsbild
Greensilver
Inlägg: 1305
Blev medlem: 21 januari 2005, 21:24:57
Ort: Sverige
Kontakt:

Inlägg av Greensilver »

Ny fråga:

I databladet för ATTiny15L står det:
The voltage reference for the ADC may be selected by writing to the REFS1..0 bits in ADMUX. VCC, the AREF pin, or an internal 2.56V reference may be selected as the ADC voltage reference. Optionally, the 2.56V internal voltage reference may be decoupled by an external capacitor at the AREF pin to improve noise immunity.
Vilket värde kan vara lämpligt på denna kondensator?
Hur tänker man när man skall dimensionera detta värde?
Användarvisningsbild
Greensilver
Inlägg: 1305
Blev medlem: 21 januari 2005, 21:24:57
Ort: Sverige
Kontakt:

Inlägg av Greensilver »

Madmodder skrev:Genom att koppla upp tangentbordet i en motståndsmatris, så kan du få ut ett unikt motståndsvärde för varje tangent, och av detta bygga en spänningsdelare, och läsa av resultatet med en ADC-kanal.

Koppla kolumnerna 1, 2 och 3 (4,3,6) via 1k, 2k och 4k till VCC.
Koppla raderna 1, 2, 3 och 4 (9,8,7,5) via 8k, 16k, 32k och 64k till ett motstånd på 64k vidare till jord.
Ovanför sista 64k-motståndet plockar du ut 10 olika spänningar.

Anslutning 2 kan du ju då skippa helt.
Nu har jag kopplat enligt ovanstående och läser av ADC'n för att få ett råvärde. Detta värde läser jag av med en switch/select sats och det fungerar kanonbra på tangenterna 1-6 men tyvärr får jag väldigt varierande värden på tangenterna 7-9. Det gör att det inte går att urskilja vilken knapp som trycks ned då en knapp ofta triggar alla tre. Går det på något sätt att öka differensen mellan dessa tangenters värden?

Mitt VCC är 3 volt.
monstrum
Inlägg: 620
Blev medlem: 13 januari 2005, 05:38:32
Ort: Göteborg

Inlägg av monstrum »

Kan du inte lägga varje rad eller kolonn till en egen ingång på A/D-omvandlaren? Då behövs inte lika noggranna spänningar.
matseng
Inlägg: 2360
Blev medlem: 16 september 2003, 17:18:13
Ort: Dubai, United Arab Emirates
Kontakt:

Inlägg av matseng »

[språkpolis på]

Du menar kolumn som i rader och kolumner? En kolonn är en sorts pelare har jag för mig... :-) Jo det stämmer, enligt susning.nu är det det:

En kolonn är
1. Ett byggelement, ofta cylinderformat, som exempelvis en pelare. Även fristående som en sorts skulptur. Avslutas ofta med kapitäl högst upp.
2. En pelarliknande anordning i en apparat, exempelvis inom kemin en destillationskolonn?
3. En militär uppställning, en truppformation där soldaterna är uppställda i en viss ordning. Gäller även fordonsformationer. (Jfr även femtekolonnare.)
4. Basvektorernas avbildning?svektor för en lineär? avbildningsmatris?


En Kolumn är
1. I en tabell: alla celler som ligger i en linje uppifrån och neråt.
2. På tidningsspråk: en spalt i vilken en kolumnist skriver från hjärtat, till skillnad från vanliga artiklar som väntas vara objektiva.
3. Svenskspråkiga Microsoft Words namn på spalter sedan Word 6.0.
[/språkpolis av]
monstrum
Inlägg: 620
Blev medlem: 13 januari 2005, 05:38:32
Ort: Göteborg

Inlägg av monstrum »

Självklart menade jag kolumner, det borde troligtvis vilket byråkrat som helst förstå.

Jag ser inte på något sätt hur ditt sista inlägg tillförde den här diskussionen något.
Skriv svar