Micropython, CardComputer - issue reading Keyboard
-
Hi, I've sucessfully installed the most recent ESP32S3 build of Micropython on my M5Stack CardComputer. Due to it being a generic build, there are no specific device drivers included with the firmware; however, I've managed to get some integrated peripherals working, ie the LCD, sdCard.
The keyboard (schematic) in giving me some problems, its a pretty standard key matrix, the rows are provides using a 74hc138 3-8 line decoder, and the columns are 7 GPIOs. The outputs from the decoder are active low (datasheet), so I made the column pins inputs with pullups - doesnt work, needs pulldowns????
Reading the column pins whilst iterating through the 8 rows should allow the individual key detection, but although key presses yield a pin change it doesn't work as expected and column 2 is always high???from time import sleep_ms from machine import Pin ''' M5Stack CardComputer Keyboard 74HC138 3 to 8 line decoder Decoder Pin A2, A1, A0 ----\ Y6, Y5, Y4, Y3, Y2, Y1, Y0 GPIO Pin G11, G9, G8 ----/ G7, G6, G5, G4, G3, G15, G13 ''' class KeyBoard(): def __init__(self): keyPins = [ ('C0', 13, Pin.IN, Pin.PULL_DOWN), ('C1', 15, Pin.IN, Pin.PULL_DOWN), ('C2', 3, Pin.IN, Pin.PULL_DOWN), ('C3', 4, Pin.IN, Pin.PULL_DOWN), ('C4', 5, Pin.IN, Pin.PULL_DOWN), ('C5', 6, Pin.IN, Pin.PULL_DOWN), ('C6', 7, Pin.IN, Pin.PULL_DOWN), ('A0', 8, Pin.OUT, None), ('A1', 9, Pin.OUT, None), ('A2', 11, Pin.OUT, None) ] ap = dict() for (name, pin, direction, pull) in keyPins: self.pinMap[name] = Pin(pin, direction, pull) def scan(self): for row in range(0,8): self.pinMap['A0'].value( row & 0b001 ) self.pinMap['A1'].value( row & 0b010 >> 1 ) self.pinMap['A2'].value( row & 0b100 >> 2 ) sleep_ms(250) print(f'{row:04b}\t',end='') for col in ['C0', 'C1', 'C2', 'C3', 'C4', 'C5', 'C6']: sleep_ms(0) val = self.pinMap[col].value() print(f'{val:01b} ', end='') print('') print('\n\n\n\n') keyboard = KeyBoard() while True: keyboard.scan() sleep_ms(500)Any ideas of where I'm going wrong??
-
Hello @MartynW
I tried your code and changed two things to make it work:
- changed the inputs to pullups (as you already thought it should be) - the output matrix then is all 1s except for the button pressed.
- used some additional brackets for A1 and A2 to force the AND operation to happen first
self.pinMap['A0'].value( row & 0b001 ) self.pinMap['A1'].value( ( row & 0b010 ) >> 1 ) self.pinMap['A2'].value( ( row & 0b100 ) >> 2 )Full code:
from time import sleep_ms from machine import Pin class KeyBoard(): def __init__(self): keyPins = [ ('C0', 13, Pin.IN, Pin.PULL_UP), ('C1', 15, Pin.IN, Pin.PULL_UP), ('C2', 3, Pin.IN, Pin.PULL_UP), ('C3', 4, Pin.IN, Pin.PULL_UP), ('C4', 5, Pin.IN, Pin.PULL_UP), ('C5', 6, Pin.IN, Pin.PULL_UP), ('C6', 7, Pin.IN, Pin.PULL_UP), ('A0', 8, Pin.OUT, None), ('A1', 9, Pin.OUT, None), ('A2', 11, Pin.OUT, None) ] self.pinMap = dict() for (name, pin, direction, pull) in keyPins: self.pinMap[name] = Pin(pin, direction, pull) def scan(self): for row in range(0,8): self.pinMap['A0'].value( row & 0b001 ) self.pinMap['A1'].value( ( row & 0b010 ) >> 1 ) self.pinMap['A2'].value( ( row & 0b100 ) >> 2 ) sleep_ms(250) print(f'{row:04b}\t',end='') for col in ['C0', 'C1', 'C2', 'C3', 'C4', 'C5', 'C6']: sleep_ms(0) val = self.pinMap[col].value() print(f'{val:01b} ', end='') print('') print('\n\n\n\n') def scan2(self): for row in (7, 3, 6, 2, 5, 1, 4, 0): self.pinMap['A0'].value( row & 0b001 ) self.pinMap['A1'].value( ( row & 0b010 ) >> 1 ) self.pinMap['A2'].value( ( row & 0b100 ) >> 2 ) sleep_ms(250) print(f'{row:04b}\t',end='') for col in ['C0', 'C1', 'C2', 'C3', 'C4', 'C5', 'C6']: sleep_ms(0) val = self.pinMap[col].value() print(f'{val:01b} ', end='') print('') print('\n\n\n\n') keyboard = KeyBoard() while True: keyboard.scan() # keyboard.scan2() sleep_ms(500)BTW: I like your coding style with the pinMap etc. (Note: I am not very familiar with Micropython.)
Thanks
Felix -
Felix,
Thank you for the extra pair of eyes much appreciated, I got so obsessed with the PULL_UP/PULL_DOWN issue, I didn't even consider the processing order of the bitwise logic!! Many thanks.
Martyn
-
Hello @martynw, I've been trying for a while to get my CardComputer's screen to work with Micropython code. I want to display a simple "hello world," but I'm having trouble. Could you help me? Could you show your code for activating the screen and writing anything on it?
-
Hello MartynW
how do you use just the machine library. When I try this the m5stack gives an error.
When I use the m5stack lib I don't have any problems with this -
@felipeparaizo said in Micropython, CardComputer - issue reading Keyboard:
Hello @martynw, I've been trying for a while to get my CardComputer's screen to work with Micropython code. I want to display a simple "hello world," but I'm having trouble. Could you help me? Could you show your code for activating the screen and writing anything on it?
Have you added a driver to control the screen?
@thijsnl said in Micropython, CardComputer - issue reading Keyboard:
Hello MartynW
how do you use just the machine library. When I try this the m5stack gives an error.
When I use the m5stack lib I don't have any problems with thisWhat's is the error?
-
@ajb2k3 said in Micropython, CardComputer - issue reading Keyboard:
Você adicionou um driver para controlar a tela?
Não, qual seria esse driver ? como posso adicionar ?
-
@felipeparaizo said in Micropython, CardComputer - issue reading Keyboard:
Não, qual seria esse driver ? como posso adicionar ?
Você precisa fazer upload do driver Micropython para a tela ST7789V2 no micropython usando thonny.
Hello! It looks like you're interested in this conversation, but you don't have an account yet.
Getting fed up of having to scroll through the same posts each visit? When you register for an account, you'll always come back to exactly where you were before, and choose to be notified of new replies (either via email, or push notification). You'll also be able to save bookmarks and upvote posts to show your appreciation to other community members.
With your input, this post could be even better 💗
Register Login