|
|
|
\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}
|
|
|