41 lines
3.0 KiB
Markdown
41 lines
3.0 KiB
Markdown
# arduino-lcd-writer
|
|
|
|
Driver code for arduino that enables writing to LCD from Linux
|
|
|
|
## Goal
|
|
Serial devices get assigned (at least on my machine) to /dev/ttyACM* (e.g. ACM0). My goal is to be able to write to `/dev/ttyACM0` and get the text displayed on the LCD display.
|
|
For example, a command like
|
|
`echo "Hello, world!" > /dev/ttyACM0` would result in "Hello, world!" being printed on the LCD.
|
|
|
|
To this end, I wrote this program. It simply reads the serial port and prints the string to the screen, with one big idiosyncracy: since `\n` isn't handled by the `lcd.print()` function, I make `?` denote a newline. Hence, if the arduino reads something like
|
|
`Hello?World` on the serial bus, it will print "Hello" on the first line and "World" on the second.
|
|
|
|
## Dependencies
|
|
This project depends on Arduino and [Arduino-Makefile](https://github.com/sudar/Arduino-Makefile). Unfortunately, my distro doesn't supply Arduino Makefile so I have to have the operation dependent on a bunch of environment variables. Many distros don't supply the Arduino libraries outside of the IDE so you probably have to install that.
|
|
|
|
## Arduino configuration
|
|
I follow the exact wiring of the [official LCD tutorial](https://docs.arduino.cc/learn/electronics/lcd-displays). I have the 16 pin, 16x2 LCD screen used in that tutorial. If you have a different size, you can adjust the code.
|
|
|
|
## Building
|
|
Download Arduino-Makefile and put it somewhere. Don't bother building or installing it unless you want to.
|
|
Simply clone this repository, open `Makefile`, and set the `ARDUINO_DIR`, `ARDMK_DIR`, and `AVR_TOOLS_DIR` to appropriate values. `ARDMK_DIR` should be wherever you downloaded Arduino-Makefile. e.g. on my setup, the three variables are set to `/usr/lib/arduino`, `~/.local/Arduino-Makefile`, and `/`, respectively. Then,
|
|
|
|
Build the program with `make`
|
|
|
|
Upload the program with `make upload`
|
|
|
|
## Notes
|
|
Here I compile some notes on operation that would be a pain to search otherwise
|
|
|
|
### How to run the program 100% successfully
|
|
By default, uploading this program and then writing to the serial device doesn't work for some reason. I follow these steps in this order to ensure correct operation. This assumes the program has already been uploaded to the Arduino.
|
|
|
|
1. Run `make reset` in the program directory - this resets the serial interface
|
|
2. Run `tail -f /dev/ttyACM0 > /dev/null` - this creates a process that constantly listens on the serial connection, keeping it alive? I'm not sure but it doesn't work without this.
|
|
3. Write stuff to the serial device - now it should work
|
|
|
|
### Previously was working
|
|
I basically had to rewrite this from scratch - the Arduino had the program uploaded on it but I lost the code. ~~That version had fast refresh rates but this one takes like 2 seconds to refresh the LCD. I don't have any applications that would break due to this so it isn't important. ~~
|
|
I fixed this issue. Apparently `Serial.readString()` is extremely slow, but `Serial.readStringUntil('\n')` (equivalent in this case) is much faster. Not sure on why but it works. I have effectively instant updates now.
|
|
|