The Newest Trend: a Fashionable Forearm Computer
Hello! My name is Katie, and I am a rising senior at the Brearley School. My starter project was the voice changer, which was made by Velleman and can be found at the following link: http://www.amazon.com/Velleman-MK171-Voice-Changer/dp/B004XZQ6RE. My main project was the Forearm Computer, which is based off of Stephanie Marks’ Integrated Sensors Electronic Bracer. Stephanie’s project can be found on her blog at http://planetstephanie.net/2012/05/27/integrated-sensors-electronic-bracer/. The forearm computer includes four sensors, the GPS, weather sensor, humidity and compass, an OLED screen, a flashlight, a few indicator LEDs, and a Teensy 3.1 to control it all. I made a few changes from Stephanie’s design, such as replacing the lux sensor with a barometric pressure sensor and replacing the sparkfun pro micro with a Teensy 3.1. I also wrote my own code for the project, using Stephanie’s for reference and ideas only. I really enjoyed building my project because I learned a lot about coding and circuits,and I was able to tackle the challenge of building a comfortable and functional case for the components.
I really like my project because it is so modifiable and it has so much potential even after the program ends. Right now, the hardware is complete, but because the wiring is still accessible, I can easily add components. I am planning to add two more sensors, a real time clock and a pulse sensor, as modifications to my project.There are also infinite improvements and additions I could make on the code as I am currently only using 7% of the available memory on the Teensy! I plan on adding an alarm, a timer and improving my GPS tracking function. I am going to use my pulse sensor to analyze how factors such as humidity, pressure, temperature, altitude and speed (all data that my project is already collecting!) affect my heart rate. My ultimate goal for the project is for the teensy to save all of its data, so you can plug it into the computer and map where you went, what the weather, altitude, and your speed were, and what your heart rate was. That way, I could wear the forearm computer on a run and then when I got home, I could see exactly what I did and how my heart responded. This would be fascinating, not to mention useful for tracking the intensity of a workout. This idea is partially based on the company of a speaker we had earlier. He made a website where users all over the world can log data such as noise pollution, air pollution, temperature, and heart rate on a website called AirCasting. I found the idea fascinating, and I was really interested about how to handle such large amounts of information.
Since my last milestone, I have gotten my project from a bunch of sensors on a breadboard to a device that you can wear. I wrote some additional functions for the code, such as the GPS tracking function and a function that displays the time. I based my code for the GPS tracking on Adafruit’s GPS dog collar (https://learn.adafruit.com/gps-dog-collar/). I read through the code, and then modified it so that it just printed the amount of miles walked. However, I have not gotten a chance to test it over a long distance, so I am sure that there is a lot I can do to modify the function. Also, in the future, I would like it to display the average speed and change in altitude.
I also added a voltage sensor to tell when the voltage is below 3.3V. The voltage sensor consists of two equal resistors (I used 200K ohms) connected end to end. One end is attached to power, and the other is attached to ground. The point where they attach is connected to an analog pin. Because the resistors are equal and in series, the analog pin will read exactly half of the total voltage drop over the two resistors. Therefore, when the analog pin reads less than 3.3/2, or 1.65V, it knows the voltage is low and alerts the user that the battery needs to be charged. The analog pins return a value between 0 and 1023 (1 byte) to correspond to voltages between 0 and 5V. On this scale, 1.65V is equivalent to 337.92. I added to the code a function to print a symbol whenever the reading is below 337.92.
Once I had all of the code working, I began to assemble my bracer. I measured and cut the leather and attached velcro on each end so it can wrap around my arm. I then took all of the components off of the breadboard (which was terrifying) and carefully soldered them together. In order to cut the wires to be the correct length, I had to plan out where all of the components would be on the bracer. I added two indicator LEDs, a buzzer, three more buttons, a power switch, an LED that lights up when it is on, a flashlight, and the voltage sensor. Then, using hot glue I fixed all of the components to the bracer. I added snap fasteners and attached the top layer to protect the electronics. Finally, I cut holes in the top layer so that the screen, GPS antenna, LEDs and buttons could be seen and accessed.
I then decided to add two modifications: a real time clock and a pulse sensor amped. For the clock function, I initially assumed that I could just use the millis function on the Teensy to keep track of time, but after researching how to do that, I learned that the Teensy completes so many functions and is often without power, so the clock would be extremely inaccurate. The GPS can set the clock, but because the project will be mostly indoors, where the GPS has no signal, I needed to find something to keep track of time indoors and even when the device is off. I chose the Adafruit real time clock (https://www.adafruit.com/products/264), which communicates over I2C, similarly to the compass and barometric sensor. The clock will send an value for time and date to the Teensy, which can then print it on the screen. One problem I had with the clock is that it needed to send and receive signals at 5V, but my Teensy runs at 3.3V. When you want two devices with different logic levels to communicate, you need a bidirectional logic level converter, which I ordered from Adafruit. I also needed to supply 5V for the clock. I plan to use a booster converter in the future, but unfortunately but the time I realized that I didn’t have time to order that part. I decided to use a 4 pack of AA batteries, which will provide 6V, to power the clock for now, and then when I order the booster I will replace it with that. I was able to connect the pulse sensor to an Arduino Uno and have it read my pulse, but because the code has interrupts every 2ms, I didn’t have time to figure out how to integrate it into the master code. I will continue to work on adding the pulse sensor after BlueStamp.
The overarching issue I had with my project was the difficulty I had figuring out what each problem was caused by. I have debugged a barometric sensor code for hours, spent three days trying to get the GPS to work until I learned that I had made a simple wiring error, dealt with a broken microcontroller and figured out how to transition to a new, more complicated one. One problem I have not solved yet is that the screen prints images stretched out, because it does not recognize the screen’s height as 64 pixels. I researched on forums and blogs for hours, and I even made my own post on the Adafruit website, which sadly no one answered. I have finally accepted that my screen still looks cool stretched out, but I will definitely continue looking for a solution. I am sure that I learned more through these problems than when things worked! I learned perseverance in finding an answer (I once found a solution on the 12th page of a Google search!), to be methodical in debugging, and to know when the time is to move on past a problem and find a new solution, all valuable lessons both in engineering and in life.
I have really loved my time at BlueStamp engineering. I have always known I was interested in math and science, but it was not until this past fall, when joined a RoboCup robotic soccer team, that I knew I wanted to pursue engineering. When it came time to find a program for the summer, BlueStamp stood out to me because it offered me the opportunity to build an amazing, useful project completely on my own. One of my favorite moments of the program was when I came to my lead instructor one morning and him if I could add a pulse sensor as a modification. I told him that I knew there wasn’t much time left in the program and that I wasn’t even finished with my main project, but I felt like a pulse sensor would make my project more meaningful and useful. I was sure that he would say no, but when I told him I would do everything I could to make it work, he ordered it for me! That positive attitude and trust the instructors have in the students is what really makes BlueStamp unique and why I am glad I got to spend the last 6 months here. The program far surpassed my expectations and made me sure that I want to be an engineer. I can’t wait to continue with this project and for many more struggles and successes in the future!
Click on photos to enlarge.
Labeled Exposed View Photos:
Bill of Materials
Milestone 2: Adding a Teensy 3.1, a GPS, a Compass and a Button
Hello! I have now completed my second milestone for my forearm computer. My project now consists of a teensy 3.1 (replacing the arduino uno), the humidity sensor, the barometric/altitude/temperature sensor, the adafruit OLED screen, the adafruit ultimate GPS, a sparkfun compass, and a pushbutton. The GPS sends data such as latitude, longitude, altitude, speed, the number of satellites it is communicating with (I’ll explain that later), the time, the date, and the age of the current data to the screen. The compass sends its heading to the screen. I use the push button to cycle through 4 different screens: the home screen, a screen that displays weather data, a screen that displays GPS data, and a screen that displays the compass data.
I began working towards this milestone by switching from the arduino uno to the teensy 3.1. I did this for a variety of reasons. First of all, the arduino uno is a very large board that would not fit on the forearm computer. Also, the uno does not have enough memory and processing power to complete all of the tasks it would have to do. I tried to use it with the screen, GPS data and weather data, and it was extremely slow. The teensy 3.1 is a much smaller and more powerful microcontroller. Arduino uses an AVR chip to process data, while the teensy uses the ARM chip. ARM chips usually cannot be programmed with arduino, but the teensy has an additional driver that allows it to use arduino. The teensy also has more pins, and 3 serial ports, which allows more devices to be used with it.
I then found out how to use the GPS. There are many satellites orbiting the earth, each with an atomic time clock. They transmit a signal at 1.575 GHz that contains its location and the time. If you are on earth, using a GPS that can listen to these signals, your location can be found by triangulation (at least 3 satellites must be seen). With 4 satellites, altitude can be determined. However, the GPS needs a clear view of the sky to receive the signals, so I needed to work downstairs by the window. The GPS library has functions that return latitude, longitude, time, altitude, speed and the number of satellites seen. I got the GPS to send that data to the teensy, and then display it on the screen. The GPS uses serial communication to send its data to the teensy. The teensy has three serial ports, which are comprised of a TX (transmit) pin and RX (receive) pin. The GPS also has a TX and RX pin. It is important that when using serial communication, the TX pin of one device connects to the RX pin of the other.
When using the GPS on the teensy, however, I had to make an important modification to the GPS code that worked with the arduino. The arduino only has one serial port, which is also used for the USB serial communication, so a device such as the GPS cannot communicate using the same port. So the arduino uses software serial, which allows any two digital pins to act as TX and RX. However, the teensy has three serial ports, so it is much easier to use hardware serial. the code initially included the line “SoftwareSerial mySerial(10, 11);” which defines pins 10 and 11 as the software TX and RX. I replaced this with the line “#define mySerial Serial3”, which will replace mySerial with Serial3 (the indicator that serial port 3 on the teensy is being used). I then used pins 7 and 8 (Serial3) on the teensy to connect to the teensy, which worked!
I then connected the compass to the teensy. The compass works by measuring the magnetic field from the earth and performing a calculation to determine the direction it is pointing. In order for it to get a correct reading, it needs to be parallel to the ground. You can also buy a compass with an accelerometer which will calculate the tilt and compensate for it in its heading calculation. The compass uses I2C to communicate with the teensy, similarly to the barometric pressure sensor. I got the compass to send its data to the teensy, and then the teensy displays it on the screen.
I used the button so that I could cycle between the different screens. One problem I had was that I would press the button and the time between the press and when the screen changed would be very long. This is because the screen would be receiving so much data that it would not realize the button had been pressed. I then decided to use interrupts, which allow the button to interrupt the code whenever its state goes from closed (pushed) to open. Interrupts are a function that will interrupt the code to perform a task. My button response time is slow because when you hit the button the code is sometimes still receiving data or performing a calculation, but if I use an interrupt, it will change screens immediately. This allowed me to display all of the data my sensors are getting on the same screen!
Milestone 1: A Screen, Barometric/Altitude/Temperature Sensor, a Humidity Sensor, and an Arduino Uno
Hello! I have completed my first milestone on my main project, the forearm computer. Running off of an arduino uno, I have a humidity sensor and a barometric/altitude/temperature sensor, as well as an adafruit OLED screen. The data from the sensors is sent to the arduino, which, in some cases, converts it to the units I want, and then sends it to the screen to be displayed.
In order to reach this milestone, I first wanted to get the screen to work. I downloaded the adafruit OLED screen library from github, and followed adafruit’s instructions for wiring the screen. A library is a code written by the designers of a device that makes it easier to use. When a library is downloaded and added to arduino, it adds more functions. For example, one of the functions in the OLED library is display.print(), which allows the user to simply write a message in quotations as the parameter, and that message will be displayed on the screen, which is much easier than the very complicated code that would have to be used to light up each individual pixel if there was no library. In order to use the adafruit OLED library, it must be downloaded and added to arduino, and also at the top of your code you must write “#include <Adafruit_SSD1306.h>” to indicate to the arduino that the library will be used so it can recognize that library’s specific functions. Other libraries have similar commands that must be written at the beginning of the code.
OLED stands for organic light emitting diode.There is a layer of an organic (meaning that it contains carbon) material that lights up in response to an electric current. This layer is placed in between two electrodes, one of which is transparent. When voltage is applied across the OLED one electrode becomes positive and the other becomes negative. A current then flows between them, across the organic material, causing it to light up. The places where voltage is applied can be manipulated by the arduino, allowing the appearance of pixels. OLED is often used in smaller projects, because it can be smaller and lighter than a regular LED display.
In order to test my screen, I used the adafruit example sketch, which, when the OLED is connected correctly, sends a series of designs to be displayed. The screen uses I2C, which is a method of communication between two or more electronic devices. I2C requires that one device be a ‘master’ and the other device be a ‘slave’. The master generates the clock, initiates communication with the slave, and sends commands to the slave. The slave device follows the master’s commands. In my case, the master is the arduino uno, and the slave is the OLED screen.
I2C only requires that the devices are connected by two wires, SDA and SCL. Data is sent over the SDA, or serial data, line, in the form of a digital signal. A digital signal is a series of pulses of voltage that can be transmitted over a wire and can be used to communicate. The states of high voltage and low voltage are often represented using ones and zeroes. I2C is synchronous, meaning that both the master and slave devices must have their clocks synchronized. This is achieved over the second wire, SCL, or serial clock. Both SDA and SCL can act as a transmitter or receiver of data. I2C allows multiple slaves to be connected to one master, because each slave has its own unique address so the master can tell which slave it is talking to.
Once I got the screen to work, I moved on to the humidity sensor. The humidity sensor does not use I2C to communicate, but instead sends its readings as an analog signal, which the arduino can read through the analog pins.Unlike a digital signal, an analog signal varies its voltage at a certain time in order to send data. Digital signals can either be high or low, while analog signals can incorporate any level of voltage. For example, in my humidity sensor, a very low humidity corresponds to an output voltage of about 0.75 (at 25⁰C and an input voltage of 5V). As the humidity reading increases, the voltage output also increases, so the highest humidity reading of 100% corresponds to an output voltage of close to 4V. The arduino uses this data, as well as the temperature data (I initially used 25⁰C, but once I had the barometric/altitude/temperature sensor working, I used data from that) to calculate a value for relative humidity. It then sends that data to the screen so it can be displayed, along with the word “Humidity:” before and “%” after.
I then began to use the barometer/altimeter/temperature sensor, which also uses I2C. I wired it to the arduino, and then I downloaded the adafruit library for the device, so I could run an example code. In order to find the barometric pressure, this device has an internal sensor in a chamber that gives a value for absolute pressure. This value is then converted to altitude in inches Hg and pressure in Pascals using the arduino. It also uses a digital thermometer that sends a signal to the arduino. Temperature is displayed, and it is also used in the absolute pressure conversions.I added this sensor to the master code, so I could print both humidity as well as pressure, altitude, and temperature to the data displayed on the screen. I added a title of “Weather” to this screen, completing my milestone!
Starter Project Blog Post: The Voice Changer
Hello, my name is Katie, and I am a rising senior at the Brearley School.
My starter project at BlueStamp Engineering is a voice changer. You speak into the microphone, and it alters your voice by increasing the pitch, decreasing the pitch, making it sound like a robot, or adding vibrato.
Here’s how it works:
The microphone picks up the sound of your voice, and converts it to an electrical signal. This signal travels to the larger integrated circuit. An integrated circuit (IC) is basically many components together in a small plastic area that has some pins sticking out of it. These pins can either be input (i.e. buttons or sensors), or output (i.e. LEDs or speakers). The IC is able to control where voltage is applied, and therefore where current flows, throughout the circuit. The first IC modifies the electrical signal that came from the microphone, depending on the settings of the four input buttons. The four buttons correspond to robot, vibrato, increase pitch, and decrease pitch.This IC is also connected to the potentiometer that can change microphone sensitivity. A potentiometer is a resistor that has a knob on it, so that when turned, its resistance can be altered. A higher resistance would allow less current, so the microphone sensitivity would increase, while a lower resistance allows more current, so the microphone sensitivity decreases.
The modified signal is then sent out of the first IC through a second potentiometer that regulates volume. Similarly to the microphone sensitivity potentiometer, when resistance increases, current will decrease and the volume will decrease, and when resistance decreases, current will increase, and the volume will also increase. The signal then goes to the second IC, which sends it out to the speaker. The speaker vibrates according to the signal, creating sound waves that we can hear.
Throughout the circuit, there are a few more components that I haven’t mentioned yet. The various resistors regulate the amount of current that is traveling through the circuit. The value of resistance for each resistor, measured in ohms, can be determined by looking at the colored stripes. There are also many capacitors throughout the circuit, which can store energy, allowing the energy of the circuit to remain stable. There is a power switch, which is attached to the battery, that allows the circuit to be turned on and off. There is also an LED connected to the switch, which indicates if the circuit is turned on or off. An LED, or light emitting diode, only allows current to flow through it in one direction, converts that energy to light. There is also a zener diode, which, similarly to the LED, only allows current to flow through it in one direction, unless the voltage is above a certain value, in which case current can flow through it in both directions.
One issue I came across while working on my project was that a loud, annoying sound was always coming out of the speaker. After doing some research, I determined that there was a positive feedback loop causing that sound, which occurs when the microphone is too close to the speaker. The sound from the speaker is picked up by the microphone, which is then emitted again from the speaker, causing amplification of the signal. In order to combat this, I replaced the wire I initially had with a longer wire, and I placed the speaker and microphone on either side of a cardboard box to minimize the sound that travels from the speaker back to the microphone. I also adjusted the potentiometers that determine the volume and microphone sensitivity in order to prevent background noises from being amplified. These modifications effectively eliminated feedback.
I initially used solid core wire to connect the speaker to the circuit board, but as that wire would be bent a lot, I decided to replace the solid core wire with stranded wire, which is more flexible. When replacing the wire, however, I burned one of the pads that I was soldering it to. As I could no longer attach the wire there, I looked at the schematic diagram, and saw that the speaker wire was connected to one end of a nearby capacitor, so I soldered that wire directly to the pad attached to the capacitor.
The result is a box that when I talk quietly into one side of it, my voice is amplified out of the other side, making me sound like an opera-singing robot, always a useful thing to have!
My main project will be a wearable forearm computer. It will have a small screen, a few buttons so the user can control what he sees, and various sensors. The sensors I will be using are: a humidity sensor, a barometric pressure and temperature sensor, a compass, a GPS, and a battery voltage sensor, and a galvanic skin response sensor. All of the information from the sensors, as well as normal functions for a clock (time, date, alarm, timer) will appear on the screen. The device will also have a flashlight, and a buzzer for the timer and alarm functions.
In order to build this device, I plan on first testing each component to be sure it works, then adding them one at a time to the master program. I anticipate that there may be some challenges getting all of the sensors to work using the same microcontroller, so I will test each function every time I add a new one. I also am not sure yet what material I will use for the outside of the device, as it should be rigid, yet wearable, so as I begin my project I will continue to look for possible materials. I am excited to begin working on this project!