Files
Lee Hanken 7c8efd2228 Initial commit: HPR Knowledge Base MCP Server
- MCP server with stdio transport for local use
- Search episodes, transcripts, hosts, and series
- 4,511 episodes with metadata and transcripts
- Data loader with in-memory JSON storage

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-10-26 10:54:13 +00:00

340 lines
30 KiB
Plaintext

Episode: 1691
Title: HPR1691: Arduino 101 Arduino IO
Source: https://hub.hackerpublicradio.org/ccdn.php?filename=/eps/hpr1691/hpr1691.mp3
Transcribed: 2025-10-18 07:47:12
---
This is HPR Episode 1691 entitled Arduino 101 Arduino I.O.
It is hosted by Klaatu and is about 43 minutes long.
The summary is, in this episode, learn how to read and write input and output from the Arduino.
This episode of HBR is brought to you by an honesthost.com.
Get 15% discount on all shared hosting with the offer code HBR15.
That's HBR15.
Better web hosting that's honest and fair at An Honesthost.com.
Hi everyone, this is Klaatu and this is, I guess we'll call this episode two of
of the Arduino series, my very modest Arduino series.
So Arduino, very very cool, it's big buzz word, people hear it, they get excited.
I hear it, I get excited. I'm like, oh, Arduino is really cool.
And I used to get excited about it like a long time ago before I even knew what an Arduino was.
I just knew that they were cool. Why? I don't know.
Because you'd seen a project maybe at something and they said, oh yeah, that's Arduino based or
maybe you've got an actual product in your home that, you know, if you investigate a little
bit further, it turns out that it's got an Arduino chip somewhere in it on it, you know,
it's being driven by Arduino. So you know, theoretically, that yes, there's something cool
about this Arduino thing, but you're not really sure exactly what that is.
So that's okay. We can start with this thing, but I'm just warning you now that the Arduino is
only I think as cool as your project, as the project that you have in mind for it is cool.
So in other words, you could get an Arduino and you could be very proud of it,
but unless you have something to do with it, it's going to be phenomenally underwhelming.
I mean, I guess that's a little bit like, well, everything really, but I mean,
I was thinking of like Linux, you know, when you first heard about Linux, you're like,
oh, that's really cool. It sounds amazing and I've heard it's really cool and I'm, you know,
I know it's supposed to be cool, but you have no idea why it's cool. And even once you start
using it, you're like, yeah, it's cool, I guess, but it's actually just really hard. And what am I
doing with this thing? But then once you start developing like all these ideas, you're like, oh,
I should do this with it. And you realize how cool it is. That's when it sort of realizes
its own reputation. Same thing goes with Arduino. Great one to start with is the Arduino Uno.
The Arduino Uno is both cheap, small, and you know, sort of basic, but at the same time,
it's cheap, small, and it has a lot of features. So it's a really good one to start with.
It's I think it's like $35 or something. So yeah, and it's again the size of a business card.
Everything in this episode is the size of a business card. So I'm going to
see breakout the Arduino here and plug it into my computer, which I have just done. And the
thing that you should know about the Arduino in terms of the computing side of the Arduino is
that you will want to get the Arduino IDE, the official Arduino IDE. It's probably available
in your software repository. You can look for it. If it's for some reason not there, then it's
probably something that you can get from Arduino.cc. That's their site, Arduino.cc. And sure enough,
if you go there, you'll find a download link for the IDE. If memory serves, you can just run it
just as is. I think it's sure it's Java-based. The IDE itself, I mean. So it's pretty simple to
just kind of fire up. But in terms of connecting to the Arduino, that can be a little bit more complex
sometimes. Depends on how you're installing this thing. But I've seen it on certainly both Mint
and Fedora. You install it, and it actually hopefully prompts you. It says, hey, it looks like
you're going to start using Arduino. You need to create like, I think it's a group for Arduino,
or like a permission policy or something. I forget what it's verbiage exactly is, but it's telling
you that you need to set something on your system so that you can actually control the Arduino,
because as we all know, or will after I say this, Linux, when it sees hardware, it doesn't just
let anyone control it. It wants to know who gets permission to control it. And the reason for that,
obviously, is because if you've got equipment plugged into the computer, I mean, not necessarily
on a multi-user system, you don't necessarily want all your users being able to access that,
certainly if it's something that requires only one user to be able to access it. So there's
a policy around hardware devices, and the automated features of the installer on whatever distribution
you may or may not be using will solve that for you. It'll flip whatever bits need to be flipped,
and then it'll prompt you to log out, you'll log out, you'll log back in, not reboot, just log out
and log back in, and then everything's ready to go. It's really simple. If you're not using one
of those distributions that has it all packaged up and prepared for you, such a slackware like I
am, then you may need to do a little bit of configuration yourself, but it's not hard,
and hearing about it will actually make you understand the automated stuff a little bit better
anyway. So what I did was I plugged the Arduino in to the computer and started up the Arduino IDE,
and sure enough, it had no idea that an Arduino was connected. So that was a little bit inconvenient,
but it's not hard to solve at all. So what you can do is you can do an ls space-l on slash dev,
slash serial s-e-r-i-a-l slash by dash id slash, and then if you just hit tab a couple of times,
you'll see eventually that there's a USB dash Arduino, blah, blah, blah hooked up to your computer.
So if you hit enter on that, then it will tell you what that is, the simlink to, and it's actually
a simlink to a TTY device. So then if we do an ls slash dev slash TTY ACM0, that's what it's a
simlink to. Sure enough, such a device exists. So ls slash dev slash TTY ACM0 is what it's called on
mine, and again if you look on yours it'll probably be something very similar. And that's where the
Arduino exists, and sure enough if I do it in ls dash l, well right now if I do that it comes up
correctly because I've set this up already before, but pretend maybe that that wasn't the case,
and you could see that it was like, I think the default permissions were maybe 600?
Maybe 640 or 620? I don't know. It was definitely not, yeah I think it was actually 640,
because the dial out group owns that. So anyway what we want it to be is readable and rightable
by other users other than just root, and in my case if it was just completely from scratch,
I would probably need it to be to anyone. So I would Chamod this thing to for instance 666,
so Chamod 666 slash dev slash TTY capital A capital C capital M0. Now once I did that sure enough
the IDE suddenly realized yes you've got an Arduino Uno on dev slash dev slash TTY ACM0,
and I was able to use the Arduino as if though nothing had ever happened. So that's what's
going on in the background if your installer did all that for you, and if it doesn't do that all
for you you're in luck, you get to be geeky, and you get to Chamod your dev slash TTY ACM0 to yourself.
To finesse that you could make a you dev rule that would listen for for instance a USB device being
plugged in on the subsystem USB for a certain vendor ID which you would find out with LSUSB
or product ID whichever you prefer, and when it detects that happening on the action add maybe
you could say okay Chamod or yes set mode 0666. So you can write your own you dev rule do a reboot
just to be sure that your rules are reloaded, and next time you plug in the Arduino it'll just
all work for you. But again all that is automated for you on other distributions I'm only speaking
from experience on Slackware, and that would probably stand true for like Slackware Engine 2 and
I don't know maybe Arch I don't know maybe if if someone did the the build script a little bit
fancier it might not might not happen on Arch. It really depends it's up to whoever does a build
script for anything really on any on any system. I just did it on Slackware myself because I kind
of understood what was going on. Okay that's that so that's how to get the Arduino up and running
in the Arduino IDE that you have downloaded and installed by now. There's a Tools menu and the
Tools menu will kind of show you where which board you have plugged in. So in this case it has
auto detected that I have an Arduino Uno board. It generally does auto detect but I wouldn't
at all say always. I've had devices that have an Arduino chip on them like little hobby electronic
devices like little not drones but like robot things. Not for me personally they've been at the
makerspace that I've all interior at so it's been a bunch of stuff lately that I've been doing where
yeah it's like oh this is some product that you buy off a shelf but look at it it's got the Arduino
on it and you can now reprogram it and some of those just have not been auto detected and you have
to look in the documentation and see what it is and then you say oh okay this isn't Arduino
like technically it's an Arduino Nano with a 18 mega 328 okay well I'll set it to that. So it
just kind of depends but a lot of times with the main Arduino you know branded things it'll auto
detect it. It may or may not detect your serial port and again like now you know how to find that
out you you look in your dev tree but in my case I've already yeah it just kind of detected that as
well because I don't know why it just did. When I very first originally started the thing up it
wanted to look at dev or serial port like com 0 or something I don't know what that is but that's
what it was looking at and then once I had set my permissions it switched over to what it has
always been since which is ACM 0 so or TTY ACM 0 okay so there you go. So let's let's plug this
Arduino in it's plugged in let's power up our breadboard so again we're going to take a red cable
maybe from the 3.3 volt pinhole on the Arduino to the red side the red column of my breadboard
and a black cable possibly or blue if you if you don't have black from the blue strip the blue
column of your breadboard over to the ground pin on your Arduino so now we've got a circuit
got a circuit going on in our breadboard. So what we're going to do here is I've got and I mean
I apologize obviously I can't really guarantee that you have the same components that I have so a
lot of this is just going to be theoretical because that's just what we've got is is theory
but I think it'll mostly make sense so I've got this little servo here that I borrowed from
the makerspace and it's so a servo goes 180 degrees motors go 360 servos go 180 so this is a servo
it'll go 180 either way and from the servo motor there are three cables there's a actually a brown
cable in this case a sort of a red orange cable and a yellow cable and kind of deducing again the
electronic sort of convention I'm figuring that the brown is negative the red is positive
and then the yellow since this is not just a binary object like this isn't sort of like
am I on or am I off but how far should I rotate the yellow is sort of the data cable if you think
of it that way so I'm going to plug this brown cable into I'm just going to go straight into my
power grid I'm not going to mess I know that in the last episode I had you connecting the grid to
the you know the the middle part to the columns on the side and that was that was to show you the
principle of all this but in reality we don't need to do that so we can just go straight into the
the negative side so I'm going to take the brown cable and plug that into the negative column the
blue column on my breadboard and the red thing I'm not going to put straight no actually the red I
can I am going to do that I'm going to put that straight into my red column on my breadboard okay so
the data column is the one I'm going to do something obviously different with and that's kind of
important because we don't really know what to do with it yet so what we can do I know I can tell
you this what we want to do with that is we want to send we want to send it signals from the
Arduino so the Arduino obviously sends out digital signals so we're going to plug the data cable
into the Arduino itself and again if you've got those links that I gave you in the last episode
and if not maybe I'll either include them in the show notes this time or I'll include them in the
or you can just go look at the previous episode but on the same sort of strip as the ground cable at
the top of the Arduino Uno there's it's labeled digital and then it's got numbers so it's like 0
through 13 I think yeah so I'm going to plug this into port 13 digital port 13 that's where my
data cable is now and that will matter in the future in the very near future
and so that's output really so what we can do now and this is a little bit difficult
because servos there's not really any way for this servo for instance to know where it is
so it doesn't know if it's at 0 degrees or 90 degrees or 180 degrees right now it just knows
that it's a servo and certainly the Arduino doesn't know where the servo is so what we'll do is we'll
program a really simple really really simple program to just tell this thing to move the servo
so the first line of our code will be hash include space servo.h and that is very specifically
include or hash include space and then open open tag like a greater than sign servo with a
capital H dot H I mean with a servo with a capital S and then dot H and then lowercase bracket
or less than rather less than bracket you know like a HTML tag okay so that's including the library
servo.h and that's just the default Arduino library it's just it's just kind of included there are
other libraries that you can get for fancier equipment but for this sort of basic stuff you
don't need anything extra so that's convenient so the next line will make it we'll declare a servo
and to do that you just say servo with a capital S and then name it something so we'll call it
my servo simple enough so now we've got a servo sort of in our code and we're saying okay we want
to use this class called servo and we want to make a specific instance of this class which we're
just going to call my servo because that makes sense and then what we'll do is we'll create a
variable and to do that we'll use int int because it's going to be an integer so int space servo
position semicolon did I put a semicolon on the it should be servo my servo semicolon and then
the next line int servo position semicolon so that's all that so then we can just basically let's do
void setup parent parent so that's the word void and then space set up all lowercase
and then parentheses parentheses so that's the rounded brackets it's parentheses parentheses and
then the next line or on the same line depending on how how you like to code one curly bracket
my servo dot attach parentheses 13 parentheses semicolon and then close the curly bracket
so you're you probably get from that that we've just attached like we've taken this specific
instance of the servo which we're calling my servo and we're doing something with it we're
attaching it to the Arduino so we're telling the Arduino hey you've got a servo located in your
13th port so 13 of course is the digital port that we plugged the servo's data cable into
and then within the void setup before the the closing curly brace let's tell it to set the servo
position and the way we're going to do that is with a my servo dot right that is dot WRIT and then
parentheses zero close parentheses semicolon that ought to work to be honest basically yeah that
should work we can try it and you can verify that it's going to work by hitting the oh you know
we need a loop sorry we do need a loop so let's do a void space loop parent parent semicolon or
not semicolon curly bracket curly bracket and you just leave that empty we're not actually going
to use the loop right now it's just it'll just be there so now if you hit the little check
check button the little tick mark in the upper left corner just under the file menu it should
tell you that it's done compiling and it shouldn't really flash or blink any ugly colors at you it
should just kind of tell you done compiling and then what we can do is send that over to our
to our Arduino with the the right pointing arrow it's it's if you roll over it says upload
and once you send it to the Arduino it should if your if your um if your servo isn't at the
zero position then it will go to the zero position after after you if you've uploaded your program
now it's the void setup clause in there that all that does it runs only once that's kind of the
init sequence or the init um it's it's the init function um of of that servo it or of this program
rather it it runs once and then it gets caught in this loop which is empty so it basically
basically stops there's a reset button on the Arduino Uno anyway and if you hit that it would
it would attempt to run it again although it's already at zero so functionally it's not actually
doing anything but what I could do now in my IDE is tell it to write my servo dot write 90 instead of
zero and then hit the upload button and let's I'll hold this up right next to the microphone so
you can maybe hear it reposition itself let's hit upload and there it went um so it just moved 90
degrees in whatever direction it chose to move so we're we're doing really really simple obviously
things uh and that's that's just outputting from the Arduino it's not sensing anything right
and that's kind of that's where it gets a little bit more exciting is when you can actually deal
with inputs and outputs so you could maybe have a loop that sat there and did nothing actively did
nothing until it received some kind of input and then it did something else something new
and we can do that and there are various kinds of input devices there are light sensors temperature
sensors there are potentiometers there are sound sensors all kinds of things so just to keep this
really really simple we're just going to use ourselves as input strangely as that strange as that
may seem so I want you to take a cable and plug it into the analog input the 0th port of the
analog input just to keep things consistent here so if you look on the picture on the open clip
art thing at the bottom next to power there's another strip of little pin holes and it's called
analog in and there's zero through five so if you plug a cable into the 0th port of the analog
pin row then we've now essentially we've got an input device believe it or not and the way that we
can make that work for us well that's a little bit more complex okay so let's go back up I'm
going to copy all this code and put it into a new window or new sketch is what they call it don't
put it into a new tab of your same of the same Arduino window because that sees it if they're tabs
they see them as the same program and things will go wrong so it has to be a new window so just go
to file new and then that'll open up a whole new window it'll call itself something something
different like sketch underscore you know the date or whatever and and then paste in the code
and now we can start modifying it so the first line we've already got include servo h that's
easy second line servo my servo that's also easy third line int servo position semicolon easy
okay now we need two more variables for the servo position and we'll say int int space servo max
equals 180 semicolon int servo min as in minimum and maximum equals 90 semicolon so that's
int servo max equals 180 semicolon int space servo min equals 90 or actually let's do zero zero
semicolon there and now we'll also need something else we're going to need let's do some we'll
call them values so int value semicolon and int value min or rather a max and let's set that
to 600 semicolon and then int val min and let's set that to let's say I don't know 50 or 40 or
something like that semicolon okay so we've got int value semicolon and that's just empty we don't
need to declare a value for that int val max equals 600 semicolon int val min equals 50 semicolon
those are our variables and now we're going to go into the void setup so again this thing only runs
once and we'll just do a void setup well it's basically already but I'll also I'll read it to you
void setup parentheses parentheses and then curly brace my servo dot attach parentheses 13 close
parentheses semicolon and then close the curly brace now we go into our void loop and so notice
there we're not setting the initial we're not doing a my servo dot right in this version of the
program so delete that that second line from your setup so now we're going to go down into the
void loop and it'll be void space loop parentheses parentheses and then curly brace
and we will we will finally declare our value and the value is going this is exciting value equals
analog read parentheses zero parentheses semicolon so analog read think about it we're reading data in
from the analog port and which port are we reading zero because we plugged it into the zero with port
remember that's why I wanted us to all do the same port um so I mean if you plugged it into five
then you could say oh analog read five or whatever but we're just keeping it at zero but I just
want you to understand what that number means it's not we're not setting anything we're saying
I want you to read data in from the analog the zero with analog port and I want you to assign it
to the value uh the the variable called value okay next line we're going to say um servo position
equals and this is going to be a map so we're saying servo position equals map parentheses
values comma val min comma val max comma servo max comma servo min close parentheses close uh
rather uh semicolon so all that sort of does is it maps several values um uh several
several variables rather um value was probably not the best name for that variable but anyway um
several variables to to where we want you know to to where we want the um servo position to end up
and so it's it's saying to take the value and then to take the value minimum and maximum
and set them within the minimum and maximum set that to the servo uh minimum and maximum because
remember we don't have you know the value minimum of our input device is not necessarily the same
as the servo minimum and the value maximum is not necessarily the same as the servo maximum
so we have we have to kind of distribute those values um relatively to one another and that's
just something that's the map function in the Arduino language okay so then servo position
we're going to set we'll type servo position equals constrain and again that's another function
that we're using uh parentheses servo position comma servo min comma servo max so we're telling the
Arduino that the the farthest the servo is permitted to go is the servo minimum and the servo maximum
and then finally we're going to write the position of the servo to the actual physical servo
and that's the what we did and the the previous little application we just did a min servo dot
right and then parentheses and instead of just hard coding zero or 90 we're going to say whatever
the servo position is so servo position close parentheses semicolon and then close the curly
brace now if we verify that code with a little tick mark button at the top left it should verify
and if not check your spelling check that you have semicolons after every line
that you've closed all your parentheses all that stuff and then assuming that worked I'm going
to upload it to the Arduino so I'm flashing the chip and it should tell you that it's done
somewhere or at least not error out now if I take this cable and touch my finger to it
you may hear that the the servo is responding to my just my touch
and that's simply really just because because I'm sending it you know I'm conductive being
and so I'm sending it like signals from from my body not that big of a deal it's you know
pretty rudimentary little sensor not very reliable you certainly would not want to use that for
anything that you actually care about because you can't really control what you're sending to it
when you're just touching a cable it really just kind of all depends and it's yeah it's kind of
it's it's basically ridiculous it's it's really just based on
arbitrary factors but there I'm putting my multi tool onto it that's not sending different
signals so yeah I mean it's just it's silly don't actually do that for anything but
but it does demonstrate so now if you if you weren't running this code like let's go back to our
other window just to prove that this this isn't some kind of magical thing if you run the other code
it sends your servo oh I had it on 90s okay so it just sent my servo to 90 whatever that is to
that servo and if I touch this analog wire nothing happens so it's it's not as if the you know
that's the fact that a wire is plugged into the analog port of the Arduino means nothing
but once you type in code for the Arduino to listen to the are doing to the analog port zero
and upload that code to it then once once it does that then it is it's listening for input on
that that port and when you send it input then it it maps those values of whatever it's getting
to to its servo and I have no idea how these values are being detected from this read I really have no
clue but what I do know is that if you had like a light sensor you could use the LDR
if you had like a light sensor then you could for instance have a light sensor plugged into the
analog port I think it would probably also need power and obviously a ground and then shine
you know a torch into the light sensor and suddenly depending on how bright the the light was
the the servo would rotate a certain degree and then if you pull the the little flashlight away
from the light sensor then the the the servo would rotate you know as or it would return to its
original position or whatever and that is what we're doing obviously so now that you know how
this is working you can kind of look at that code the map code and see that we're saying okay take
the servo position or set the servo position rather to a to to the mapping of the overall value
of whatever we're getting at the analog read and make the assigned correspond the the minimum value
to the servo max and the max value to the servo minimum so it's rotating basically inversely
dependent upon what kind of signals it's receiving to from the analog signal and it's never going
so far that it exceeds the servo minimum or the servo maximum which is nice because you don't
really want to try to you don't want to strain the little servo really so there you go that's
that's the really really the basics of Arduino the takeaway really is not necessarily how to make
a servo or go or or how a buzzer buzzes it's it's that well it's how electricity works and how
you can use it and also that the Arduino is it's if you think of it at least for me if you think of
it as just a piece of software rather than just don't think of it as hardware because if you think
of it as hardware you'll start to try to like figure out how things are connected and stuff like
that and as you saw from our first program which doesn't require any input that you know that
that can mislead you because if if the Arduino doesn't have code to respond to input then you can
send signals to it all day long and it's not nothing's going to happen so if you think of it as
software and just think okay I've got some set of inputs and I've got some set of outputs and
how do I get inputs into it well I use these little hardware devices and I learn about them
and I learn what their values are their potential values are and and how to wire them into the Arduino
and then according to what I what I research I can import a library if necessary and then I could
use like a potentiometer and the more you turn the potentiometer the more the little servo turns
and so on and and using resistors you could make things go dimmer or faster or slower or whatever
there's a whole world out there of sort of controlled electronics that you could you can harness
with with really just an Arduino and like a breadboard and if you want something more permanent
then you'll want to eventually get little circuit boards that you can actually solder your cables
to and and make it you know a lot more permanent and that's a lot of fun as well but again all that
requires a project and so what you'll want to do really at some point I mean definitely get an
Arduino like if you're interested in one get one I think I've shown you that it doesn't take a
whole lot to get started with one just you do have to you're you're gonna want to buy some
components so that you can mess around with it and make it do things in the real world that you can
see because otherwise it's just a circuit board that you know in theory it might do something
so you'll want to get some components and then just hook them up and start programming and see what
you can make occur and and see what conditions you can make things happen under you know like how
you can change the response depending on on a different input or something just play around with
that and then once you've got all that down once you get that theory solidly ingrained in your in
your mind then you can do all the other you know you can kind of come up with some kind of really
cool project and kind of figure out what you want your Arduino to actually control and and then
you can start programming for it and and hooking up all the different hardware and and really see
where it takes you it's it's a very exciting little world it's really cool because the the entire
Arduino board itself is open source so this is a big deal it's it's very exciting and you should
try it if you're interested in it I think you'll really enjoy it and it's not as scary as it might
seem and it's not really as puzzling as it might seem it's it's just a little bit of understanding of
how electricity works it's a little bit of understanding of how input and output works and from
there it's sitting around playing with with code playing with wires and playing with low signals of
electricity so have a great time I hope this has been helpful and if you come up with anything
cool let me know you've been listening to hecka public radio at hecka public radio dot org
we are a community podcast network that releases shows every weekday Monday through Friday
today's show like all our shows was contributed by an hbr listener like yourself if you ever
thought of recording a podcast then click on our contributing to find out how easy it really is
hecka public radio was founded by the digital dot pound and the infonomicom computer club
and it's part of the binary revolution at binrev.com if you have comments on today's show
please email the host directly leave a comment on the website or record a follow-up episode yourself
unless otherwise stated today's show is released on the creative comments
attribution share a light 3.0 license