You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

115 lines
4.4 KiB

3 years ago
  1. \documentclass[11pt]{article}
  2. %Gummi|065|=)
  3. \usepackage{graphicx}
  4. \usepackage{caption}
  5. \usepackage{xcolor}
  6. \usepackage[vcentering,dvips]{geometry}
  7. \geometry{papersize={6in,9in},total={4.5in,6.8in}}
  8. \title{\textbf{UserSpace IO via uLisp and Arduino Uno}}
  9. \author{Steak Electronics}
  10. \date{}
  11. \begin{document}
  12. \maketitle
  13. %\tableofcontents
  14. \textcolor{green!60!blue!70}{
  15. \section{UserSpace IO via uLisp and Arduino Uno}}
  16. Overview: Goal is to get an easy way to echo "command" > /dev/ARDUINO from GnuLinux userspace.
  17. Then I can 3D print a box, throw some LEDs in there, and get a hardware interface for anything from my distro.
  18. \subsection{Setup}
  19. First off, I installed the stable uLisp from ulisp.com (AVR version 3.4 in 2020/12).
  20. \subsubsection{Trouble with interfacing directly to
  21. ttyACM0 / ttyUSB0} The Arduino Uno uses an FTDI USB to Serial chip. It also has more than just RX/TX connected (I think). This means
  22. that when you echo "something" to arduino, this command will open the serial connection, send the command, then close the command and
  23. possibly reset the board via one of the UART reset pins (DTS perhaps). This won't work. First thing to do, get an FTDI board, and
  24. connect it to the computer, the connect it to digital pins 0,1 (for UART). Then test sending a command. This works. This will be the
  25. final setup. Computer -> FTDI -> Arduino.
  26. It should be possible to get it to work without the FTDI chip, but not without some debugging. Have at it, if you wish. I don't have
  27. time to troubleshoot this now. I tried a few things (exec 3<>, and the stty) neither worked. You could also use Python, but then that's
  28. more dependencies. Bad idea. This should be simple.
  29. Ref:
  30. https://forum.arduino.cc/index.php?topic=61127.0
  31. https://arduino.stackexchange.com/questions/16776/how-to-connect-arduino-device-to-linux
  32. https://stackoverflow.com/questions/3918032/bash-serial-i-o-and-arduino
  33. \subsubsection{Troubleshooting Code}
  34. The first thing you will want to do is prove that you can echo or cat "code" > /dev/ARDUINO.
  35. This code works:
  36. \begin{verbatim}
  37. (defun b (&optional x)
  38. (pinmode 13 :output)
  39. (digitalwrite 13 x)
  40. (delay 1000)
  41. (b (not x)))
  42. (b)
  43. \end{verbatim}
  44. Save it as a text file, then cat the file into /dev/ttyUSB0 or /dev/ARDUINO. Problem is, the code runs
  45. indefinitely. You can't tell it to do anything else. Hit the reset button to restart the Uno back to square one. So instead, you want a
  46. function that runs and then stops. Here's one of those:
  47. \begin{verbatim} (defun b ()
  48. (pinmode 13 :output)
  49. (digitalwrite 13 nil)
  50. (delay 500)
  51. (digitalwrite 13 t)
  52. (delay 200)
  53. (digitalwrite 13 nil)
  54. (delay 500)
  55. (digitalwrite 13 t)
  56. (delay 200)
  57. (digitalwrite 13 nil)
  58. (delay 500)
  59. (digitalwrite 13 t)
  60. (delay 200)
  61. (digitalwrite 13 nil)
  62. (delay 500)
  63. (digitalwrite 13 t)
  64. (delay 200))
  65. (b)
  66. \end{verbatim}
  67. This works. Save it as a .dat or .txt (whatever) and cat file.txt > /dev/ARDUINO. It will blink a few times, then
  68. stop. You can cat it again, if you wish. There, now we have an interface, and we have proven we can switch an IO high/low. With a couple
  69. of functions, it's trivial to build an interface.\footnote{i.e. have one function set IO high for a given pin. Have one function set IO low.
  70. Have one function blink IO some amount of times. This can be used for counters or shift registers, or in the former, just controlling GPIO.}
  71. Tip: When building code, copy and paste into the Arduino Serial Monitor first. This way, if there's an error, it will tell you what's
  72. wrong. After you've tested the code, then you can put it in a text file. As we are keeping this simple, we don't have logging setup, or
  73. anything else. This is meant to be for basic IO from user space, not C compiled programs. Think lightweight. Fast. Fun.
  74. \subsection{An interface for basic GPIO}
  75. Now, let's build an API/interface so that we can flip some IO, and perhaps increment as mentioned.
  76. \begin{verbatim}
  77. let's ask this: what do I want to accomplish?
  78. answer: I want to be able to flash leds from user space. possibly increment a counter, but
  79. that's later. for now, just flash leds.
  80. solution: build box / board for uno. connect everything up. build initialization program
  81. (that will enable outputs as high)
  82. Then find a way to send commands from gnulinux. let's begin.
  83. 1. build initialization program
  84. 2. create enclosure, and wire up leds
  85. 3. run program live from gnuLinux.
  86. \end{verbatim}
  87. \end{document}