
\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). 
\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, that 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 loop 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 run a few times, then stop. You can echo it again, if you wish.
There, now we have an interface, and we have proven we can switch an IO high. With a couple of functions, it's trivial to go from there.\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.}


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.





\end{document}

