Website URL

Location

Interests

Sparkfun

Github

Overview
dAISy (do AIS yourself) is a very simple AIS receiver that I developed from scratch. It is built around the Silicon Labs EZRadioPRO Si4362 receiver, using a Texas Instruments MSP430G2553 MCU for processing and the MSP-EXP430G2 v1.5 LaunchPad as development platform.
The complete project source code and schematics are available on GitHub: https://github.com/astuder/dAISy Update 5/18/2015: A finished, self-contained AIS receiver based on this project is now available for purchase in my web store.
AIS, short for Automatic Identification System, is a standard for tracking ships. Ships advertise their position, course and other information with short transmissions on specific frequencies (161.975 MHz and 162.025 MHz). More on Wikipedia.
An AIS receiver, like dAISy, receives and decodes AIS transmissions. It then re-packages the raw data into NMEA sentences (specifically formatted ASCII strings). Finally, using a serial connection, these strings are forwarded to more capable equipment for further processing.
If you're the lucky owner of a tricked out boat, you could connect dAISy to your navigation computer. For land lobbers like me, a more common use case is to run naval mapping software that supports AIS data input on a PC. In the screenshot below I've connected dAISy to OpenCPN (link), an open source chart plotter and navigation software.
On the top right you can see my setup war-driving at the Seattle waterfront as my lab is too far from the coast to receive anything. The LaunchPad sits on the dashboard with a white USB cable connecting to the notebook computer in the foreground.
dAISy's data is fed into OpenCPN, bottom right shows a log of the serial data received. OpenCPN maintains a database of all the collected data (lower left) and visualizes nearby ships on a map (top center), including past and projected course. Hovering the mouse over a ship will display its name (text on yellow ground) and clicking it will reveal more detail (top left).
Hardware
I wanted to build my own, non-SDR, AIS receiver for a long time. There are a few projects floating around the internet (e.g. here) which refer back to an article by Peter Baston, published 2008 in Circuit Cellar magazine (copy available here gone.. google for Peter Baston Circuit Cellar to find other copies). Unfortunately, the CMX family of modem ICs by CMS Microcircuits (link) used in these projects are relatively expensive ($15+) and hard to find for hobbyists. In addition you'd need a radio to do tune into and down-convert from the ~162 MHz carrier frequency.
So I was quite excited when earlier this year a parametric search on Mouser brought up a new IC that covered the required range (162 MHz) and modulation (GMSK). And best of all, available in single quantities for $3.56 $2.27 $2.22! (link)
The Silicon Labs EzRadioPRO Si4362 (link) is a single chip receiver that covers frequencies from 142 to 1050 MHz and supports various modulations, including GMSK. It comes in a tiny 20-pin QFN package and the only external parts required are a 30 MHz crystal, an antenna with a few capacitors and inductors for impedance matching, and finally some decoupling caps and pull-down resistors.
Time to whip up a breakout board. I used the opportunity to give KiCad a try and quite like it.
Here's the schematic:
And the layout:
I used OSHPark to make the PCBs. At a smidgen over one square inch it cost $5.15 for 3 copies: http://oshpark.com/shared_projects/QUWi71r4
Note that the layout still has three issues that I already fixed in the schematic:
GPIO0 and GPIO1 were flipped
SDO required a pull-down resistor as the radio leaves it floating when not actively sending, which confused the hell out of me while trying to figure out the communication protocol.
Lastly, the holes for the headers turned out to be slightly too small to comfortably fit the cheap breakout headers I had at hand.
Edit: Here's Rev B where I fixed these issues: http://oshpark.com/shared_projects/WI6u3Qmk
Which brings us to the BOM:
Silicon Labs Si4362 (U1)
30 MHz crystal (X1)
Si4362 datasheet specifies <11 pF load capacitance, but a crystal specified for 12pF load capacitance seems to work fine too
Antenna/LNA matching network, calculated based on SiLabs AN643 (link, approx. values, +/- 5% shouldn't matter too much):
75 ohm (dipole): 10 pF (CR1), 5 pF (CR2), 280 nH (LR1), 200 nH (LR2)
50 ohm: 12 pF (CR1), 6 pF (CR2), 240 nH (LR1), 160 nH (LR2)
Decoupling caps:
100 pF, 100 nF, 1uF (C1, C2, C3)
Pull-down resistors
100 k (R1, R2)
First thing I noticed when I received the parts: The 20-pin QFN at 4x4 millimeters is tiny!
I mounted it by first tinning the pads with a small quantity of solder. I then added flux and placed the chip on the pad. I then used a hot air station to carefully reflow the solder. Worked the first time around.
After using jumper wires to figure out how to talk to the chip, I mounted the breakout board on a makeshift BoosterPack using perfboard, double-sided tape and wire (see picture at the top of the post).
Here's how I ended up connecting the breakout board to the LaunchPad / MSP430G2553:
SEL -> P1.4 (SPI chip select)
SCLK -> P1.5 (SPI CLK)
SDO -> P1.6 (SPI MISO)
SDI -> P1.7 (SPI MOSI)
GPIO0 -> P2.0 (I/O unused)
GPIO1 -> P2.1 (I/O clear-to-send)
GPIO2 -> P2.2 (I/O RX clock)
GPIO3 -> P2.3 (I/O RX data)
SDN -> P2.4 (shutdown / reset)
IRQ -> P2.5 (I/O channel-clear)
Software
The software of dAISy consists of three major blocks:
Radio configuration and control over SPI
Packet handler, including a basic FIFO for received messages
NMEA encoding and transmission to the PC over UART
For UART (TX only) and SPI (TX/RX) I use the MSP430G2553's USCI A0 and B0 respectively. In both cases I don't use interrupts which simplifies things considerably.
Upon reset the following steps happen:
Initialize MSP430 peripherals
Initialize packet handler, which will also reset FIFO
Initialize and configure of radio, which will also setup SPI
Start packet handler, which will also put the radio into receive mode
And in the main loop:
If debug messages are enabled, poll packet handler for status and errors and report them over UART
Check FIFO for new packets
If there is a new packet, invoke NMEA processing (which sends the message over serial to the PC) and remove packet from FIFO
Below follows a more detailed discussion of the radio integration and the implementation of the packet handler.
Radio
The communication with the radio is vanilla SPI using 4 wires: MOSI (SDI), MISO (SDO), CLK (SCLK) and CS (SEL). I used the MSP430's USCI B0 to implement SPI and a separate pin to control CS.
The only tricky thing to figure out was, that the Si4362 keeps the MISO line floating unless it actively transmits data. This is unfortunate as the master is supposed to poll for a specific response (FF) to detect when the radio is ready to receive more commands. This is easily fixed by adding a weak pull down resistor to SDO. I did this on the board, but it probably also works with using MSP430's internal pull-down.
Additional lines I used to control the radio are:
SDN to reset the radio
CTS, which by default is mapped to the radio's GPIO1, indicating that the radio is ready for the next command
While taking up an extra pin, CTS turned out to be much more convenient than the SPI response code to properly time communication flow with the radio. In dAISy, I wait for CTS to go high after each command to ensure the radio completed its task.
The communication protocol is quite extensive but well documented:
EZRadioPRO API Documentation describes the complete API and all registers
AN633 Programming Guide for EZRadioPro Si4x6x Devices describes how to use the API in common scenarios
Both are available on the Si4362 product page (link), under Documentation > Application Notes and are still updated quite frequently.
The radio is set up by dumping a large configuration sequence into it. This includes configuration of radio frequency, modulation, GPIO pins and more. This information is stored in radio_config.h, which has to be generated with a tool called WDS (Wireless Development Suite). WDS is available in the Tools section on the Si4362 product site.
Above are the settings I used for dAISy. WDS will use this information to configure various amplifiers, filters, clocks and decoding algorithms inside the chip. As Si4362 supports GMSK encoding only indirectly (see this thread), I'm certain there's more optimization potential by tweaking registers, but that's currently way beyond my knowledge of RF theory.
While the Si4362 comes with its own packet handler, it unfortunately does not support NRZI encoding (Wikipedia). So I set up the radio to expose the 9600 baud clock and received data on separate pins and implemented my own packet handler.
Packet Handler
The packet handler (inspired by Peter Baston's implementation) is implemented as a state machine that is invoked on each rising edge of pin P2.2 which receives the data clock.
There are 5 main states:
Off, no processing of incoming data
Reset, start from anew, either on start up or after successful/failed processing of a packet
Wait for Sync, waiting for a training sequence to arrive (010101..) and start flag (01111110), implemented with its own state machine
Reset, start new preamble
0, last bit was a zero
1, last bit was a one
flag, training sequence complete, now process start flag
Prefetch, ingest the next 8 message bits to ease further processing
Receive Packet, process bits until the end flag (01111110) is found or an error situation occurs
Independent of state, the interrupt routine continually decodes NRZI into actual bit sequence.
In the "Receive Packet" state there's continuous calculation of the packet CRC and some bit-de-stuffing. When the end flag is found and the CRC is correct, the received message is committed into the FIFO. If an error is encountered, the bytes already written to the FIFO are discarded. In both cases, the state machine starts anew by transitioning into RESET.
This reads like a lot of code for an interrupt handler. However with the MCU running at 16MHz even the most complex state only uses a fraction (<10%) of the available time.
Future Improvements
Lastly a list of things I'd like to improve with the next version of dAISy.
Software:
Receiving on both AIS channels through channel-hopping done 1/5/2014
Tweak radio settings for better sensitivity and lower error rate
LED(s) for indicating reception of valid/corrupt packets
Hardware:
Proper antenna connector
Layout PCB as BoosterPack and/or USB dongle
Receiving on both AIS channels at once with two radio ICs
-- edit 12/25: replaced original post with high-level project description, more detailed documentation of implementation to come
-- edit 12/28: added documentation for hardware (here and on Github), fixed some typos
-- edit 12/31: added documentation for software and list of future improvements
-- edit 01/05: implemented channel hopping (change to state machine)
-- edit 01/15: changed state machine to reflect recent changes (see post further down for details), added link to shared project on OSHPark
-- edit 01/25: major rework of sync detection state machine

Hello fellows,
I need some help, i have get a code http://store.43oh.com/download/uploads/TheTerminal-OLEDDisplay/code/GWDeveloper-OLED_MSP430_USCI.zip.
Now I have made some changes and I get the code working correctly, This display shows 4 lines of 8 pixels each, the code is implemented to work with a 6x8 font that is displayed correctly. I need to run a larger font, can anyone help me to rewrite the source code correctly that allows me to view a larger font correctly.

MSP430 based Nixie tube clock.
I was looking for some nice Nixie tube digit images so I could add them to my EduKit library, but I couldn't find any usable ones. I decided to just buy few of them and photograph myself. Then I thought that it would be a horrible waste if they just sit in a drawer. So here it is, my first Nixie project since... 1987.
This clock will be available as kit, but since this is v1, I will most likely make some adjustments.
Any suggestions are welcome.

Hi Guys!
I have MSP430 EXP LauchPad for my course. I want to program this lauchpad on Linux Mint but I have some troubles about that. Firstly, I downloaded Code Composer Studio to work on it but I had a error about port FET. Now I decided to download Energia, it looks like arduino IDE that is why I know about cart and port settings. My trouble on Energia is on the picture:

This is my first attempt with Energia. Sorry to ask so many questions. I need to know what state the G2553 is left in after whatever Energia does to it automatically so I know what I need to do, such as:
Does it set the top of the stack?
Does it set the clock to 1 MHz? 8 MHz?
Does it disable the watchdog function?
Does it return P2.6 and P2.7 to GPIO use?
Does it leave all port pins as inputs with PU resistors?
Does it set up a timer to generate interrupts for millis()?
Also, where can I find this kind of information? I didn't have any luck searching for it here, or on the .nu site.
Thanks

Here are the files for my PCB Exposer/Printer, it is the complete package including mechanical design files.
The printer itself.
Example - a power control PCB for Raspberry Pi - 40 x 40 mm.
Code includes driver for MCP4725 DAC, buffered serial port driver, stepper motor control and command parsing for the MSP430G2553 used as the main controller.
Code and design files:
PCB Exposer - controller code for MSP430G2553.zip
PCB Exposer - desktop application.zip
PCB Exposer - mechanical design files in Vectric format.zip
PCB Exposer - schematics and PCBs.zip
Desktop application is coded in C#, schematics and PCBs in KiCad format.
There is some more information to be found in this tread:
http://forum.43oh.com/topic/4990-what-are-you-doing-right-now/page-5
Terje

Hi,
I am completely new to serial communication. I wish to use a high speed ADC from TI ADS 8361. I want to interface with msp430g2553 using energia IDE. Can I get some code to check the ADC functions.

Hi,
When doing offset calibration for pH sensor in Arduino we bring pH 7 to 2.5V as Arduino analog output is 5V. Does that mean when the same is done with msp430g2553 the voltage be adjusted to 1.5V as msp430g2553 analog pins output around 3V only?
When I tried adjusting the pot I could only bring it to a minimum of 2.5V with msp430.
Does anyone know why?
Thanks.

I am trying to establish SoftwareSerial Communication between 2 msp430g2553 units. I have connected them as follows: GND to GND, RX to TX and vice versa.
MSP1: P1_5, P1_7 //Rx,Tx
MSP2: P1_5, P1_7//Rx, Tx , I hope the connection is all right.
Now, I want to send a byte from one mcu to the other for which I write the following code:
Send function:
void sendrequest(){
byte option = 1;
mySerial.write(option);
delay(2);
return;
}
void loop()
{
// put your main code here, to run repeatedly:
if(mySerial.available()>0){
checkiffalsesignal();
delay(10000);
}
}
void checkiffalsesignal(){
byte a = mySerial.read();
if(a==1)Serial.println("Low Budget");
else if(a==2)Serial.println("High Budget");
else Serial.println("False Signal");
delay(2);
return;
}
The second one is the receive function. But, I either receive nothing on the serial monitor or sometimes, I receive a "False Signal" message. Where is the fault?

I had a HDC1080 EVM. I read that the back end of the evm can be broken off from the perforation and used as a standalone sensor on a micro-controller. I tried to interface it with the MSP430G2553. I have done the following with no avail:
1) the jumper on P1.6 has been removed(no interference of led with SCL line)
2) I have tried using pullup resistors on both the SCL and SDA lines. I have tried out with the standard 4.7k resistors and also with 10k resistors.
3) I always get a temperature value of -40 degree C and humidity of 0%, which means that the MSP is not able to get the readings through.
4) I am using the Wire library on Energia1.6.10E18 and I followed TI's tutorial video on how to implement HDC1080 on Arduino. Here's the link (
)
Here's my code:
?
#include <Wire.h>
void setup() {
// put your setup code here, to run once:
Serial.begin(9600);
Wire.begin();
//Wire.setModule();
Wire.beginTransmission(0x40);
Wire.write(0x02);
Wire.write(0x90);
Wire.write(0x00);
Wire.endTransmission();
delay(20);
}
void loop() {
// put your main code here, to run repeatedly:
double temperature;
double humidity;
humidity = readSensor(&temperature);
Serial.println(temperature);
Serial.println(humidity);
delay(1000);
}
double readSensor(double* temperature){
uint8_t Byte[4];
int value;
uint16_t temp;
uint16_t humidity;
Wire.beginTransmission(0x40);
Wire.write(0x00);
Wire.endTransmission();
delay(20);
Wire.requestFrom(0x40,4);
if(4<=Wire.available())
{
Byte[0]=Wire.read();
Byte[1]=Wire.read();
Byte[3]=Wire.read();
Byte[4]=Wire.read();
temp = (((unsigned int)Byte[0] <<8 | Byte[1]));
*temperature = (double)(temp)/(65536)*165-40;
humidity = (((unsigned int)Byte[3] <<8 | Byte[4]));
return (double)(humidity)/(65536)*100;
}
}
Where is it going wrong?

I am trying to implement the msp430g2553 on a breadboard. Where should I add the reset button. I am not sure, but I think it should be added between reset pin and ground. BTW, I have the msp430 working on the breadboard, 47k between RST and Vcc and 1 nF between RST and GND. Where to add the pushbutton? The pushbutton is really handy for resetting

I want to interface a DHT11 temperature and humidity sensor with my MSP430G2553. I looked up the Energia list of libraries, but the link for DHT11 is currently inactive. I tried downloading libraries from github, even ported over libraries from arduino, but none of them are working. I either get timeout errors or nothing gets printed on serial monitor at all. I know for sure that my sensor is perfectly fine because I have tested it for multiple libraries on Arduino. Please provide me the link for a valid DHT11 Energia library or help me out otherwise.

This is a fun project that was created for my embedded systems class at John Brown University that allows you to create your own quiz wizard similar to the jeopardy game show system. The main portion of this code is run on an MSP430F5529 launchpad, and nRF24L01 transceiver modules were used to obtain the wireless functionality. It makes use of the Enrf24.h library to operate the transceiver modules, and the user interface is output to the serial monitor of the energia IDE. Four buttons wired into the MSP430F5529 then allow the user to interact with the system. The wireless module was created by using an MSP430G2553 launchpad, button, and LED for indicating power on. The LCD display can be integrated although an Arduino MEGA is needed to have it be fully functional with the rest of the system, so the code for this portion of the project was not uploaded.
Enrf24_RXdemo.ino
Enrf24_TXdemo.ino
Rough Circuit Schematic.pdf

I need to have a very accurate PWM frequency generated with my MSP430G2553IRHB32R. I'm shooting for 25.1khz. However, when running on different boards, I can see variances of up to 3khz in the frequency. I understand this is due to the slight inaccuracy in the processor's internal clock. So, I would like to attach an external crystal or oscillator to it but don't know how. I've read a couple places that say that this chip doesn't support a crystal, but that I could use an oscillator.
The questions I have is how does one connect the oscillator, and what code changes are necessary to take advantage of the oscillator?
Thanks.