Sida 1 av 2
10-tangenters matris till 2 pins buss (köksbordsbyggarnivå
Postat: 1 februari 2006, 18:37:16
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.
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
Postat: 1 februari 2006, 18:46:44
av Tekko
Gummituta
Det luktar kodlås/larm om detta projekt, vad ska det bli exakt ?
Postat: 1 februari 2006, 19:03:40
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.
Postat: 1 februari 2006, 19:31:16
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?
Postat: 1 februari 2006, 19:36:20
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?
Tack för alla tips!

Postat: 1 februari 2006, 19:45:07
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
Postat: 1 februari 2006, 20:02:58
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.
Postat: 1 februari 2006, 20:24:52
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.

Postat: 1 februari 2006, 21:30:14
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.
Postat: 1 februari 2006, 21:44:31
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.

Postat: 3 februari 2006, 17:30:58
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?
Postat: 4 februari 2006, 18:31:55
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.
Postat: 4 februari 2006, 18:49:19
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.
Postat: 4 februari 2006, 19:29:56
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]
Postat: 4 februari 2006, 19:34:37
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.