This is the ServoCam Project, as shown here: http://youtu.be/riiqyXnckR4

Dependencies:   mbed NetEthApiLPC1768 NetServicesLPC1768 Camera_LS_Y201 Servo

Committer:
tbaumg
Date:
Fri Jun 03 19:12:28 2011 +0000
Revision:
0:13c861a5ed0f
V1

Who changed what in which revision?

UserRevisionLine numberNew contents of line
tbaumg 0:13c861a5ed0f 1 #include "mbed.h"
tbaumg 0:13c861a5ed0f 2 #include "Camera_LS_Y201.h"
tbaumg 0:13c861a5ed0f 3 #include "Servo.h"
tbaumg 0:13c861a5ed0f 4 #include "EthernetNetIf.h"
tbaumg 0:13c861a5ed0f 5 #include "HttpServer.h"
tbaumg 0:13c861a5ed0f 6
tbaumg 0:13c861a5ed0f 7 Servo servo1(p21);
tbaumg 0:13c861a5ed0f 8 Servo servo2(p22);
tbaumg 0:13c861a5ed0f 9 DigitalOut myled(LED1);
tbaumg 0:13c861a5ed0f 10 DigitalOut myled4(LED4);
tbaumg 0:13c861a5ed0f 11 Camera_LS_Y201 cam1(p13, p14);
tbaumg 0:13c861a5ed0f 12 Serial device(p28, p27); // tx, rx
tbaumg 0:13c861a5ed0f 13 LocalFileSystem local("local"); // Create the local filesystem under the name "local"
tbaumg 0:13c861a5ed0f 14 LocalFileSystem fs("webfs");
tbaumg 0:13c861a5ed0f 15
tbaumg 0:13c861a5ed0f 16 EthernetNetIf eth;
tbaumg 0:13c861a5ed0f 17 HttpServer svr;
tbaumg 0:13c861a5ed0f 18
tbaumg 0:13c861a5ed0f 19 FILE *fp = NULL;
tbaumg 0:13c861a5ed0f 20 int datcnt = 0;
tbaumg 0:13c861a5ed0f 21 float ServoVal1[5] = {0,.25,.5,.75,1};
tbaumg 0:13c861a5ed0f 22 //float ServoVal2[5] = {0,.25,.5,.75,1};
tbaumg 0:13c861a5ed0f 23 float ServoVal2[5] = {1,.9,.5,.1,0};
tbaumg 0:13c861a5ed0f 24
tbaumg 0:13c861a5ed0f 25 /**
tbaumg 0:13c861a5ed0f 26 * Callback function for readJpegFileContent.
tbaumg 0:13c861a5ed0f 27 *
tbaumg 0:13c861a5ed0f 28 * @param buf A pointer to a buffer.
tbaumg 0:13c861a5ed0f 29 * @param siz A size of the buffer.
tbaumg 0:13c861a5ed0f 30 */
tbaumg 0:13c861a5ed0f 31 void callback_func(int done, int total, uint8_t *buf, size_t siz) {
tbaumg 0:13c861a5ed0f 32 fwrite(buf, siz, 1, fp);
tbaumg 0:13c861a5ed0f 33
tbaumg 0:13c861a5ed0f 34 static int n = 0;
tbaumg 0:13c861a5ed0f 35 int tmp = done * 100 / total;
tbaumg 0:13c861a5ed0f 36 if (n != tmp) {
tbaumg 0:13c861a5ed0f 37 n = tmp;
tbaumg 0:13c861a5ed0f 38 // You can print the progress to LCD here.
tbaumg 0:13c861a5ed0f 39 }
tbaumg 0:13c861a5ed0f 40 }
tbaumg 0:13c861a5ed0f 41
tbaumg 0:13c861a5ed0f 42 int capture(int n) {
tbaumg 0:13c861a5ed0f 43 /*
tbaumg 0:13c861a5ed0f 44 * Take a picture.(L)
tbaumg 0:13c861a5ed0f 45 */
tbaumg 0:13c861a5ed0f 46 if (cam1.takePicture() != 0) {
tbaumg 0:13c861a5ed0f 47 return -1;
tbaumg 0:13c861a5ed0f 48 }
tbaumg 0:13c861a5ed0f 49 // lcd.locate(0, 1);
tbaumg 0:13c861a5ed0f 50 device.printf("Captured.\r\n");
tbaumg 0:13c861a5ed0f 51
tbaumg 0:13c861a5ed0f 52 char fname[64];
tbaumg 0:13c861a5ed0f 53
tbaumg 0:13c861a5ed0f 54 /*
tbaumg 0:13c861a5ed0f 55 * Open file.
tbaumg 0:13c861a5ed0f 56 * Read the content.
tbaumg 0:13c861a5ed0f 57 */
tbaumg 0:13c861a5ed0f 58 snprintf(fname, sizeof(fname) - 1, "/local/IMG_%04d.jpg", n);
tbaumg 0:13c861a5ed0f 59 fp = fopen(fname, "wb");
tbaumg 0:13c861a5ed0f 60 if (fp == NULL) {
tbaumg 0:13c861a5ed0f 61 return -2;
tbaumg 0:13c861a5ed0f 62 }
tbaumg 0:13c861a5ed0f 63 //lcd.locate(0, 0);
tbaumg 0:13c861a5ed0f 64 device.printf("Capture: %04d\r\n", n);
tbaumg 0:13c861a5ed0f 65 datcnt = 0;
tbaumg 0:13c861a5ed0f 66 if (cam1.readJpegFileContent(callback_func) != 0) {
tbaumg 0:13c861a5ed0f 67 fclose(fp);
tbaumg 0:13c861a5ed0f 68 return -3;
tbaumg 0:13c861a5ed0f 69 }
tbaumg 0:13c861a5ed0f 70 fclose(fp);
tbaumg 0:13c861a5ed0f 71
tbaumg 0:13c861a5ed0f 72 /*
tbaumg 0:13c861a5ed0f 73 * Stop taking pictures.
tbaumg 0:13c861a5ed0f 74 */
tbaumg 0:13c861a5ed0f 75 cam1.stopTakingPictures();
tbaumg 0:13c861a5ed0f 76
tbaumg 0:13c861a5ed0f 77 return 0;
tbaumg 0:13c861a5ed0f 78 }
tbaumg 0:13c861a5ed0f 79
tbaumg 0:13c861a5ed0f 80
tbaumg 0:13c861a5ed0f 81 int main() {
tbaumg 0:13c861a5ed0f 82 device.baud(115200);
tbaumg 0:13c861a5ed0f 83 device.printf("***********************************\r\n");
tbaumg 0:13c861a5ed0f 84 device.printf("**** ServoCamera mbed Project ****\r\n");
tbaumg 0:13c861a5ed0f 85 device.printf("**** NXP mbed Design Challenge ****\r\n");
tbaumg 0:13c861a5ed0f 86 device.printf("***********************************\r\n");
tbaumg 0:13c861a5ed0f 87 wait(.25);
tbaumg 0:13c861a5ed0f 88
tbaumg 0:13c861a5ed0f 89 if (cam1.reset() == 0) {
tbaumg 0:13c861a5ed0f 90 device.printf("Camera Reset OK.\r\n ");
tbaumg 0:13c861a5ed0f 91 }
tbaumg 0:13c861a5ed0f 92 wait(.5);
tbaumg 0:13c861a5ed0f 93
tbaumg 0:13c861a5ed0f 94 //device.printf("setImageSize=%d\n", cam1.setImageSize(LS_Y201::ImageSize640x480));
tbaumg 0:13c861a5ed0f 95 //wait(1);
tbaumg 0:13c861a5ed0f 96 device.printf("******************************\r\n");
tbaumg 0:13c861a5ed0f 97 /* device.printf("** MOVE SERVO **\r\n");
tbaumg 0:13c861a5ed0f 98 for(float p=0; p<1.0; p += 0.01) {
tbaumg 0:13c861a5ed0f 99 servo2 = p;
tbaumg 0:13c861a5ed0f 100 servo1 = p;
tbaumg 0:13c861a5ed0f 101 wait(0.15);
tbaumg 0:13c861a5ed0f 102 }
tbaumg 0:13c861a5ed0f 103 */
tbaumg 0:13c861a5ed0f 104 servo2 = 0.5;
tbaumg 0:13c861a5ed0f 105 servo1 = 0.5;
tbaumg 0:13c861a5ed0f 106 device.printf("** SERVOs CENTERED! **\r\n");
tbaumg 0:13c861a5ed0f 107 device.printf("******************************\r\n");
tbaumg 0:13c861a5ed0f 108 wait(2);
tbaumg 0:13c861a5ed0f 109 int cnt = 0;
tbaumg 0:13c861a5ed0f 110 int col = 0;
tbaumg 0:13c861a5ed0f 111 int row = 0;
tbaumg 0:13c861a5ed0f 112 servo2 = 0.5;
tbaumg 0:13c861a5ed0f 113 servo1 = 0.3;
tbaumg 0:13c861a5ed0f 114 wait(1);
tbaumg 0:13c861a5ed0f 115 for (int j = 0; j < 3; j++) {
tbaumg 0:13c861a5ed0f 116 col = j;
tbaumg 0:13c861a5ed0f 117 servo1 = (ServoVal1[col+1]-0.15); // Move servo to new position
tbaumg 0:13c861a5ed0f 118 for (int i = 0; i < 3; i++) {
tbaumg 0:13c861a5ed0f 119 row = i;
tbaumg 0:13c861a5ed0f 120 servo2 = ServoVal2[row+1]; // Move servo to new position
tbaumg 0:13c861a5ed0f 121 wait(1);
tbaumg 0:13c861a5ed0f 122 myled4 = 0; // turns LED ON
tbaumg 0:13c861a5ed0f 123 int r = capture(cnt); // capture image
tbaumg 0:13c861a5ed0f 124 if (r == 0) {
tbaumg 0:13c861a5ed0f 125 device.printf("[%04d]:OK.\r\n", cnt);
tbaumg 0:13c861a5ed0f 126 } else {
tbaumg 0:13c861a5ed0f 127 device.printf("[%04d]:NG. (code=%d)\r\n", cnt, r);
tbaumg 0:13c861a5ed0f 128 }
tbaumg 0:13c861a5ed0f 129 cnt++;
tbaumg 0:13c861a5ed0f 130 myled4 = 1; // turns LED OFF
tbaumg 0:13c861a5ed0f 131 }
tbaumg 0:13c861a5ed0f 132 }
tbaumg 0:13c861a5ed0f 133 servo2 = 0.5;
tbaumg 0:13c861a5ed0f 134 servo1 = 0.3;
tbaumg 0:13c861a5ed0f 135 //
tbaumg 0:13c861a5ed0f 136 Base::add_rpc_class<DigitalOut>();
tbaumg 0:13c861a5ed0f 137
tbaumg 0:13c861a5ed0f 138 device.printf("\r\nSetting up Ethernet...\r\n");
tbaumg 0:13c861a5ed0f 139 EthernetErr ethErr = eth.setup();
tbaumg 0:13c861a5ed0f 140 if(ethErr)
tbaumg 0:13c861a5ed0f 141 {
tbaumg 0:13c861a5ed0f 142 device.printf("Error %d in setup.\n", ethErr);
tbaumg 0:13c861a5ed0f 143 return -1;
tbaumg 0:13c861a5ed0f 144 }
tbaumg 0:13c861a5ed0f 145 device.printf("\r\nSetup OK\r\n");
tbaumg 0:13c861a5ed0f 146
tbaumg 0:13c861a5ed0f 147 svr.addHandler<SimpleHandler>("/hello");
tbaumg 0:13c861a5ed0f 148 svr.addHandler<RpcHandler>("/rpc");
tbaumg 0:13c861a5ed0f 149 svr.addHandler<FSHandler>(""); //Default handler
tbaumg 0:13c861a5ed0f 150 //Example : Access to mbed.htm : http://a.b.c.d/webfs/mbed.htm
tbaumg 0:13c861a5ed0f 151
tbaumg 0:13c861a5ed0f 152 svr.bind(80);
tbaumg 0:13c861a5ed0f 153
tbaumg 0:13c861a5ed0f 154 device.printf("\r\nListening @port 80...\r\n");
tbaumg 0:13c861a5ed0f 155
tbaumg 0:13c861a5ed0f 156 //
tbaumg 0:13c861a5ed0f 157 while (1) {
tbaumg 0:13c861a5ed0f 158 Net::poll();
tbaumg 0:13c861a5ed0f 159 myled = 1;
tbaumg 0:13c861a5ed0f 160 wait(0.2);
tbaumg 0:13c861a5ed0f 161 myled = 0;
tbaumg 0:13c861a5ed0f 162 wait(0.2);
tbaumg 0:13c861a5ed0f 163 }
tbaumg 0:13c861a5ed0f 164
tbaumg 0:13c861a5ed0f 165 }