This is a quick guide to enabling I2C support on the Raspberry PI operating system Raspbian. This may work on the other Linux based distros available for the Pi but I have not checked.
Next we need to enable the kernel drivers for  I2C, by default the drivers are blacklisted so we must un-comment the lines that include “i2c-bcm2708”
sudo nano /etc/modprobe.d/raspi-blacklist.conf
Then add the kernel module “i2c-dev” to /etc/modules
sudo nano /etc/modules
Then finally reboot the Pi
sudo reboot
Using the I2C Command Line Tools
The i2c-tools package provide a number tools for operating on the I2C bus using the command line. The first is i2cdetect which scans the bus for devices and then prints an address map.
i2cdetect -y 1
The next is i2cset, this is a tool that allows you to set register values on an I2C device. The first argument after the bus is the chip address, then the register address and finally the value to write. All of the arguments are in decimal.
i2cset -y 1 <chip> <addr> <value>
The opposite to the set command is i2cget, this reads a register on an I2C device.
i2cget -y 1 <chip> <addr>
Another tool is i2cdump which reads out all of the registers of a I2C device.
I have built the R2R ladder DAC, that I had previously built on breadboard, on a piece of copper clad board. This has fixed something that I forgot to mention in the last post; which was that at the lower end of the sawtooth ramp there was a high frequency oscillation. This was probably because of the poor grounding I had when testing. In the right-hand corner of the board I built a op-amp buffer stage.
Below is a screenshot from my Oscilloscope of the DAC in operation. As you can see it works!
This post is about an R2R Ladder DAC that I build one evening. I wanted to play around with the Arduino Mega 2560 board I have and this seemed like a perfect way to try it out. Below is the schematic for the DAC…
This is an 8-bit DAC built-up from just resistors, each bit is connected to a GPIO pin of the Arduino. I built the circuit on a breadboard and connected it to the Arduino using jumpers.
The first thing I did with the software is toggle the MSB bit using the Ardino digitalWrite() function, however using these functions makes writing to the DAC far too slow. So I needed to write directly to the ATmega GPIO registers and to avoid jitter I use a Timer interrupt. At the moment the software just increments PORTA each interrupt and lets it overflow, this creates a sawtooth wave on the output of the DAC and exercises each bit in the DAC.
There are a lot of different methods used to debounce switch inputs and this post is just about one method that I read about recently and used a couple of times now. So far it seems pretty good and does the job.
The C code for this method is just below, I defined it as a macro so I can use it for multiple switch inputs. All you need to do is execute this code at a fixed sample rate and it will do the rest.
What this basically does is average samples. When the input is high the “integrator” counts up until it reaches the PERIOD constant. Then it sets the output high and also saturates the integrator to the value of PERIOD. When the input is low the integrator counts down until it reaches 0 when it sets the output low.
I cant remember where I found this method, I believe the link is somewhere on Jack Ganssle’s website. He also has a good tutorial on switch debouncing.
A couple of weeks ago I ordered some stuff from Seedstudio and after a few days they arrived! I brought a Bus Pirate (with some accessories like the LCD adapter) and the Little Wire kit. I will post another article about the Bus Pirate later on, but this post will just be on the Little Wire.
I found out about the Little Wire on Dangerous Prototypes and thought it looked really interesting and I got it while ordering the Bus Pirate. It’s a really tiny through-hole circuit board with an ATTINY85 device, an LED, some passives and a USB A connector. The on-board firmware allows you to control the IO pins of the MCU from a PC. The author of the kit has provided a lot of example software to show you how to use the kit.
It comes as a kit of parts so it does require assembly, and it is really easy to put together as there are not many parts on it. Below is a photograph of the bare PCB before I started soldering it.
Assembly
Assembly of the kit is really easy and quick. The first thing I soldered in were the resistors. There are four of them right next to the USB connector.
The next components are the two Zener diodes. These are necessary because the USB data lines D+ and D- are only designed to take 3.3V in and the ATTINY chip is powered by 5V. What the Zeners do is clamp the output of the ATTINY to 3V. Be sure to put them in the correct way around! The black ring signifies the Cathode of the diode.
The next items to go in are the chip socked, capacitors and the pin headers. Unfortunately I didn’t get a photo of these steps, but below is a photo of what the results look like.
Running the Blinky Demo
No that I have the board assembled I want to try it out! I cloned the GitHub repo which has the firmware and a collection of software you can run to interface to the board. Note that I’m using Ubuntu to run the software, your operating system may need different, and/or extra steps.
The C and C++ libraries need libusb installed to compile and use them. If you don’t have libusb installed you can get it with this command
sudo apt-get install libusb-dev
Then you can make the software, in this case I’m running the C example programs. I found out that in I needed to run the example program as root in order for it to work. I am not sure why this is, it may have something to do with how libusb works. The Saleae Logic software also needs to be run as root as well.
make
sudo ./blink
Pin 4 of the LittleWire will now be producing a roughly 1Hz square wave. Below is a screen shot of what the Saleae Logic analyser measured on Pin 4.
The End….
I’d like to do some more playing around with the Little Wire, I think it will be very useful. I’d like have a go programming an AVR using it. I’d like to play around with the processing code as well. I have also just found out that there is a Basic interpreter written for the Little Wire on GitHub so I think I’ll play around with that bit at some point as well.
Recently I ordered an Arduino UNO and two shields from Adafruit and two weeks ago it arrived… YAY! As soon as I signed for it I rushed to unpacked it! I was amazed at how small it is, it looked bigger in photos. So far over this couple of weeks I’ve only used a few times but those few times I have used I have been very impressed with it.
After that I built the two shields, the first was a Protoshield with screw terminals, and the second was the data logging shield. These were both pretty easy to build and the instructions where excellent. The next thing I did was get the arduino sampling with the ADC, I did this by simply hooking a 10k pot to A0. Then I soldered an LM35 onto the data logging shield and hooked 3V3 to the VREF pin as recommended by Adafruit. At this point I was using the Serial port to get the samples out.
The next day I decided to follow the tutorials on how to use the SD card interface. Thanks to the excellent work by the authors of the various libraries this was very easy. The same for using the RTC. It all just came together and I had the Arduino sampling temperature with a timestamp to the SD card.
In conclusion I think the Arduino is fantastic and I hope to use it much more my future projects. I especially like the idea of the Arduino Pro and Nano because they can be embedded in a system somewhere.
We use cookies on our website to give you the most relevant experience by remembering your preferences and repeat visits. By clicking “Accept All”, you consent to the use of ALL the cookies. However, you may visit "Cookie Settings" to provide a controlled consent.
This website uses cookies to improve your experience while you navigate through the website. Out of these, the cookies that are categorized as necessary are stored on your browser as they are essential for the working of basic functionalities of the website. We also use third-party cookies that help us analyze and understand how you use this website. These cookies will be stored in your browser only with your consent. You also have the option to opt-out of these cookies. But opting out of some of these cookies may affect your browsing experience.
Necessary cookies are absolutely essential for the website to function properly. These cookies ensure basic functionalities and security features of the website, anonymously.
Cookie
Duration
Description
cookielawinfo-checkbox-analytics
11 months
This cookie is set by GDPR Cookie Consent plugin. The cookie is used to store the user consent for the cookies in the category "Analytics".
cookielawinfo-checkbox-functional
11 months
The cookie is set by GDPR cookie consent to record the user consent for the cookies in the category "Functional".
cookielawinfo-checkbox-necessary
11 months
This cookie is set by GDPR Cookie Consent plugin. The cookies is used to store the user consent for the cookies in the category "Necessary".
cookielawinfo-checkbox-others
11 months
This cookie is set by GDPR Cookie Consent plugin. The cookie is used to store the user consent for the cookies in the category "Other.
cookielawinfo-checkbox-performance
11 months
This cookie is set by GDPR Cookie Consent plugin. The cookie is used to store the user consent for the cookies in the category "Performance".
viewed_cookie_policy
11 months
The cookie is set by the GDPR Cookie Consent plugin and is used to store whether or not user has consented to the use of cookies. It does not store any personal data.
Functional cookies help to perform certain functionalities like sharing the content of the website on social media platforms, collect feedbacks, and other third-party features.
Performance cookies are used to understand and analyze the key performance indexes of the website which helps in delivering a better user experience for the visitors.
Analytical cookies are used to understand how visitors interact with the website. These cookies help provide information on metrics the number of visitors, bounce rate, traffic source, etc.
Advertisement cookies are used to provide visitors with relevant ads and marketing campaigns. These cookies track visitors across websites and collect information to provide customized ads.