Texas Instruments, Beagle's heart factory, has launched a cheap module that provides wifi connectivity to your garage project. This post is about how communicate a tiny mini Teensy with a CC3000 breakout from Adafruit.
Wiring
Pins mapping
Teensy pin | CC3000 pin | Color |
GND | GND | Black |
Vin | Vin | Red |
13 | CLK | Blue |
12 | MISO | Orange |
11 | MOSI | Yellow |
10 | CS | Green |
4 | VBEN | Ochre |
3 | IRQ | Purple |
Teensy stuff
I will conveniently assume that you already have Teensyduino (Arduino 1.0.5 + Teensy add-on), if not, please take a look to this page.
Library
Click here and download the lastest Adafruit's CC3000 Library for Arduino IDE. Unzip the file and rename the just created directory to "Adafruit_CC3000". Go to Arduino IDE and import the library.
(My Arduino IDE is almost in spanish :P)
Power
You can supply power via USB (my choice for debugging) or Vin.
Testing
For testing purposes I wrote a program that sends a heartbeat every 2 seconds. Check this code out.
#include <Adafruit_CC3000.h> #include <ccspi.h> #include <SPI.h> #include <string.h> #include <stdlib.h> #include "utility/debug.h" #define ADAFRUIT_CC3000_IRQ 3 #define ADAFRUIT_CC3000_VBAT 4 #define ADAFRUIT_CC3000_CS 10 Adafruit_CC3000 cc3000 = Adafruit_CC3000(ADAFRUIT_CC3000_CS, ADAFRUIT_CC3000_IRQ, ADAFRUIT_CC3000_VBAT, SPI_CLOCK_DIV2); // YOU MUST EDIT THIS #define WLAN_SSID "YOUR_AP_NAME" #define WLAN_PASS "YOU_AP_PASS" /// // Security can be WLAN_SEC_UNSEC, WLAN_SEC_WEP, WLAN_SEC_WPA or WLAN_SEC_WPA2 #define WLAN_SECURITY WLAN_SEC_WPA2 // Server configuration example, YOU MUST EDIT THIS const uint8_t SERVER_IP[4] = { 192, 168, 0, xx }; const uint16_t SERVER_PORT = 3000; /// #define HEARTBEAT_INTERVAL 2000 static Adafruit_CC3000_Client client; static uint32_t last_heartbeat_time; static uint8_t connect_retry_count = 0; void connect_to_server(void) { if(connect_retry_count > 0) { Serial.println(F("CC3000> Waiting 2 seconds before retrying to connect...")); delay(2000); } Serial.println(F("CC3000> Connecting to server...")); client = cc3000.connectTCP(cc3000.IP2U32(SERVER_IP[0], SERVER_IP[1], SERVER_IP[2], SERVER_IP[3]), SERVER_PORT); if (!client.connected()) { Serial.println(F("CC3000> Can't connect to server")); connect_retry_count++; return; } connect_retry_count = 0; Serial.println(F("CC3000> Connected!")); last_heartbeat_time = millis(); } // Set up the HW and the CC3000 module (called automatically on startup) void setup(void) { Serial.begin(115200); delay(1000); // Without this delay Serial Monitor does not work /* Initialise the module */ Serial.println(F("\nCC3000> Initializing...")); if (!cc3000.begin()) { Serial.println(F("CC3000> Couldn't begin()! Check your wiring?")); while(1); } if (!cc3000.connectToAP(WLAN_SSID, WLAN_PASS, WLAN_SECURITY)) { Serial.println(F("CC3000> Failed!")); while(1); } Serial.println(F("CC3000> Connected to AP")); /* Wait for DHCP to complete */ Serial.println(F("Request DHCP")); while (!cc3000.checkDHCP()) { delay(100); // ToDo: Insert a DHCP timeout! } /* Display the IP address DNS, Gateway, etc. */ while (! displayConnectionDetails()) { delay(1000); } } void loop(void) { if(!client.connected()) { connect_to_server(); } else { if(millis() - last_heartbeat_time >= HEARTBEAT_INTERVAL) { client.fastrprintln("Hi, I'm a Teensy"); last_heartbeat_time = millis(); } } } // Tries to read the IP address and other connection details bool displayConnectionDetails(void) { uint32_t ipAddress, netmask, gateway, dhcpserv, dnsserv; if(!cc3000.getIPAddress(&ipAddress, &netmask, &gateway, &dhcpserv, &dnsserv)) { Serial.println(F("Unable to retrieve the IP Address!\r\n")); return false; } else { Serial.print(F("\nIP Addr: ")); cc3000.printIPdotsRev(ipAddress); Serial.print(F("\nNetmask: ")); cc3000.printIPdotsRev(netmask); Serial.print(F("\nGateway: ")); cc3000.printIPdotsRev(gateway); Serial.print(F("\nDHCPsrv: ")); cc3000.printIPdotsRev(dhcpserv); Serial.print(F("\nDNSserv: ")); cc3000.printIPdotsRev(dnsserv); Serial.println(); return true; } }
Applications
I'm using these devices to build a swarm robot for a robotic contest in Chile. You can see a proof-of-concept in this video: