
\documentclass[11pt]{article}
%Gummi|065|=)
\usepackage{graphicx}
\usepackage{caption}
\usepackage{xcolor}
\usepackage[vcentering,dvips]{geometry}
\geometry{papersize={6in,9in},total={4.5in,6.8in}}
\title{\textbf{UserSpace IO via uLisp and Arduino Uno}}
\author{Steak Electronics}
\date{}
\begin{document}

\maketitle

%\tableofcontents
\textcolor{green!60!blue!70}{
  \section{UserSpace IO via uLisp and Arduino Uno}}
Overview: Goal is to get an easy way to echo "command" > /dev/ARDUINO from GnuLinux userspace.

Then I can 3D print a box, throw some LEDs in there, and get a hardware interface for anything from my distro. 

\subsection{Setup} 
First off, I installed the stable uLisp from ulisp.com (AVR version 3.4 in 2020/12). 

\subsubsection{Trouble with interfacing directly to 
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 
that when you echo "something" to arduino, this command will open the serial connection, send the command, then close the command and 
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 
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 
final setup. Computer -> FTDI -> Arduino.


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 
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 
more dependencies. Bad idea. This should be simple.

Ref: 

https://forum.arduino.cc/index.php?topic=61127.0

https://arduino.stackexchange.com/questions/16776/how-to-connect-arduino-device-to-linux

https://stackoverflow.com/questions/3918032/bash-serial-i-o-and-arduino

\subsubsection{Troubleshooting Code}
The first thing you will want to do is prove that you can echo or cat "code" > /dev/ARDUINO.
This code works:
\begin{verbatim}
(defun b (&optional x)
  (pinmode 13 :output)
  (digitalwrite 13 x)
  (delay 1000)
  (b (not x)))
(b) 
\end{verbatim} 

Save it as a text file, then cat the file into /dev/ttyUSB0 or /dev/ARDUINO. Problem is, the code runs 
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 
function that runs and then stops. Here's one of those: 

\begin{verbatim} (defun b ()
  (pinmode 13 :output)
  (digitalwrite 13 nil)
  (delay 500)
  (digitalwrite 13 t)
  (delay 200)
  (digitalwrite 13 nil)
  (delay 500)
  (digitalwrite 13 t)
  (delay 200)
  (digitalwrite 13 nil)
  (delay 500)
  (digitalwrite 13 t)
  (delay 200)
  (digitalwrite 13 nil)
  (delay 500)
  (digitalwrite 13 t)
  (delay 200))
(b)
\end{verbatim} 
This works. Save it as a .dat or .txt (whatever) and cat file.txt > /dev/ARDUINO. It will blink a few times, then 
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 
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. 
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.}


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 
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 
anything else. This is meant to be for basic IO from user space, not C compiled programs. Think lightweight. Fast. Fun.

\subsection{An interface for basic GPIO}
Now, let's build an API/interface so that we can flip some IO, and perhaps increment as mentioned.

\begin{verbatim}
 let's ask this: what do I want to accomplish? 

 answer: I want to be able to flash leds from user space. possibly increment a counter, but
 that's later. for now, just flash leds.

 solution: build box / board for uno. connect everything up. build initialization program
 (that will enable outputs as high)
 Then find a way to send commands from gnulinux. let's begin.

1. build initialization program
2. create enclosure, and wire up leds
3. run program live from gnuLinux.

\end{verbatim}




\end{document}

