The controller for a NERF turret, allowing it to track and fire at a human face with visual input gotten by polling a web server. This is part of the final project of the EE149 course of UC Berkeley. The project name is "Pew Pew".
Dependencies: HTTPClient TSI cc3000_hostdriver_mbedsocket mbed
camera.h@0:4a30986db2fb, 2014-12-19 (annotated)
- Committer:
- impguard
- Date:
- Fri Dec 19 11:49:27 2014 +0000
- Revision:
- 0:4a30986db2fb
Final version of the controller for the NERF turret.
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
impguard | 0:4a30986db2fb | 1 | /** |
impguard | 0:4a30986db2fb | 2 | * |
impguard | 0:4a30986db2fb | 3 | * Code to get data from the camera by connecting to a web server via WiFi (using Adafruit CC3000). |
impguard | 0:4a30986db2fb | 4 | * |
impguard | 0:4a30986db2fb | 5 | * author: Leo Kam |
impguard | 0:4a30986db2fb | 6 | * |
impguard | 0:4a30986db2fb | 7 | * |
impguard | 0:4a30986db2fb | 8 | * The code to connect to the web via Adafruit is adapted from the code by Ben Zhang and Antonio Iannopollo, found at |
impguard | 0:4a30986db2fb | 9 | * http://developer.mbed.org/users/nebgnahz/code/CC3000_demo/ |
impguard | 0:4a30986db2fb | 10 | * The following libraries are used: |
impguard | 0:4a30986db2fb | 11 | * - cc3000_hostdriver_mbedsocket |
impguard | 0:4a30986db2fb | 12 | * (http://developer.mbed.org/users/Kojto/code/cc3000_hostdriver_mbedsocket/) |
impguard | 0:4a30986db2fb | 13 | * - HTTPClient (http://developer.mbed.org/users/donatien/code/HTTPClient/) |
impguard | 0:4a30986db2fb | 14 | * |
impguard | 0:4a30986db2fb | 15 | **/ |
impguard | 0:4a30986db2fb | 16 | |
impguard | 0:4a30986db2fb | 17 | |
impguard | 0:4a30986db2fb | 18 | #include "mbed.h" |
impguard | 0:4a30986db2fb | 19 | #include "cc3000.h" |
impguard | 0:4a30986db2fb | 20 | #include "HTTPClient.h" |
impguard | 0:4a30986db2fb | 21 | |
impguard | 0:4a30986db2fb | 22 | // KL25Z wifi connection |
impguard | 0:4a30986db2fb | 23 | // we need to define connection pins for: |
impguard | 0:4a30986db2fb | 24 | // - IRQ => (pin D3) |
impguard | 0:4a30986db2fb | 25 | // - Enable => (pin D5) |
impguard | 0:4a30986db2fb | 26 | // - SPI CS => (pin D10) |
impguard | 0:4a30986db2fb | 27 | // - SPI MOSI => (pin D11) |
impguard | 0:4a30986db2fb | 28 | // - SPI MISO => (pin D12) |
impguard | 0:4a30986db2fb | 29 | // - SPI CLK => (pin D13) |
impguard | 0:4a30986db2fb | 30 | // plus wifi network SSID, password, security level and smart-configuration flag. |
impguard | 0:4a30986db2fb | 31 | mbed_cc3000::cc3000 wifi(D3, D5, D10, SPI(D11, D12, D13), |
impguard | 0:4a30986db2fb | 32 | "EECS-PSK", "Thequickbrown", WPA2, false); |
impguard | 0:4a30986db2fb | 33 | |
impguard | 0:4a30986db2fb | 34 | // create an http instance |
impguard | 0:4a30986db2fb | 35 | HTTPClient http; |
impguard | 0:4a30986db2fb | 36 | |
impguard | 0:4a30986db2fb | 37 | // str is used to hold the response data |
impguard | 0:4a30986db2fb | 38 | char str[512]; |
impguard | 0:4a30986db2fb | 39 | char * p; |
impguard | 0:4a30986db2fb | 40 | |
impguard | 0:4a30986db2fb | 41 | // setup the serial connection, and LEDs |
impguard | 0:4a30986db2fb | 42 | Serial pc(USBTX, USBRX); |
impguard | 0:4a30986db2fb | 43 | DigitalOut led_red(LED_RED); |
impguard | 0:4a30986db2fb | 44 | DigitalOut led_green(LED_GREEN); |
impguard | 0:4a30986db2fb | 45 | |
impguard | 0:4a30986db2fb | 46 | void initializeWiFi() { |
impguard | 0:4a30986db2fb | 47 | // by default, it's red |
impguard | 0:4a30986db2fb | 48 | led_red = 0; |
impguard | 0:4a30986db2fb | 49 | led_green = 1; |
impguard | 0:4a30986db2fb | 50 | |
impguard | 0:4a30986db2fb | 51 | //print message to indicate the program has started |
impguard | 0:4a30986db2fb | 52 | pc.printf("CC3000 Sample Program\r\n"); |
impguard | 0:4a30986db2fb | 53 | wifi.init(); |
impguard | 0:4a30986db2fb | 54 | pc.printf("Wifi Initialized\r\n"); |
impguard | 0:4a30986db2fb | 55 | |
impguard | 0:4a30986db2fb | 56 | // check connection status |
impguard | 0:4a30986db2fb | 57 | while(wifi.is_connected() == false) { |
impguard | 0:4a30986db2fb | 58 | // try to connect |
impguard | 0:4a30986db2fb | 59 | if (wifi.connect() == -1) { |
impguard | 0:4a30986db2fb | 60 | pc.printf("Failed to connect." |
impguard | 0:4a30986db2fb | 61 | "Please verify connection details and try again.\r\n"); |
impguard | 0:4a30986db2fb | 62 | led_red = 0; |
impguard | 0:4a30986db2fb | 63 | led_green = 1; |
impguard | 0:4a30986db2fb | 64 | } else { |
impguard | 0:4a30986db2fb | 65 | pc.printf("IP address: %s \r\n", wifi.getIPAddress()); |
impguard | 0:4a30986db2fb | 66 | |
impguard | 0:4a30986db2fb | 67 | //once connected, turn green LED on and red LED off, and exit loop |
impguard | 0:4a30986db2fb | 68 | led_red = 1; |
impguard | 0:4a30986db2fb | 69 | led_green = 0; |
impguard | 0:4a30986db2fb | 70 | break; |
impguard | 0:4a30986db2fb | 71 | } |
impguard | 0:4a30986db2fb | 72 | } |
impguard | 0:4a30986db2fb | 73 | } |
impguard | 0:4a30986db2fb | 74 | |
impguard | 0:4a30986db2fb | 75 | |
impguard | 0:4a30986db2fb | 76 | /* Get the x, y-coordinates and depth from camera. Return true if successfuly retrieve data from server, else return false and do not change parameters. */ |
impguard | 0:4a30986db2fb | 77 | bool getCameraData(double &x, double &y, double &z, int timeout=2000) { |
impguard | 0:4a30986db2fb | 78 | // check connection status |
impguard | 0:4a30986db2fb | 79 | while(wifi.is_connected() == false) { |
impguard | 0:4a30986db2fb | 80 | // try to connect |
impguard | 0:4a30986db2fb | 81 | if (wifi.connect() == -1) { |
impguard | 0:4a30986db2fb | 82 | pc.printf("Failed to connect." |
impguard | 0:4a30986db2fb | 83 | "Please verify connection details and try again.\r\n"); |
impguard | 0:4a30986db2fb | 84 | led_red = 0; |
impguard | 0:4a30986db2fb | 85 | led_green = 1; |
impguard | 0:4a30986db2fb | 86 | } else { |
impguard | 0:4a30986db2fb | 87 | pc.printf("IP address: %s \r\n", wifi.getIPAddress()); |
impguard | 0:4a30986db2fb | 88 | |
impguard | 0:4a30986db2fb | 89 | //once connected, turn green LED on and red LED off, and exit loop |
impguard | 0:4a30986db2fb | 90 | led_red = 1; |
impguard | 0:4a30986db2fb | 91 | led_green = 0; |
impguard | 0:4a30986db2fb | 92 | break; |
impguard | 0:4a30986db2fb | 93 | } |
impguard | 0:4a30986db2fb | 94 | } |
impguard | 0:4a30986db2fb | 95 | int ret = http.get("https://pew-pew-pew.herokuapp.com/position", str, 512); |
impguard | 0:4a30986db2fb | 96 | if (!ret) { |
impguard | 0:4a30986db2fb | 97 | p = strtok(str, " "); |
impguard | 0:4a30986db2fb | 98 | x = atof(p); |
impguard | 0:4a30986db2fb | 99 | p = strtok(NULL, " "); |
impguard | 0:4a30986db2fb | 100 | y = atof(p); |
impguard | 0:4a30986db2fb | 101 | p = strtok(NULL, " "); |
impguard | 0:4a30986db2fb | 102 | z = atof(p); |
impguard | 0:4a30986db2fb | 103 | pc.printf("Camera data: %f %f %f\r\n", x, y, z); |
impguard | 0:4a30986db2fb | 104 | return true; |
impguard | 0:4a30986db2fb | 105 | } else { |
impguard | 0:4a30986db2fb | 106 | /*pc.printf("Error - ret = %d - HTTP return code = %d\r\n", |
impguard | 0:4a30986db2fb | 107 | ret, |
impguard | 0:4a30986db2fb | 108 | http.getHTTPResponseCode());*/ |
impguard | 0:4a30986db2fb | 109 | return false; |
impguard | 0:4a30986db2fb | 110 | } |
impguard | 0:4a30986db2fb | 111 | } |