エレキジャック Web版 マイコン・カーを製作してみよう<21> マイコンカー制御プログラムです。http://www.eleki-jack.com/arm/2012/10/21.html このプログラムは次回の記事でアップされるパソコン用プログラムを使ってマイコンカーを制御するプログラムです。マイコンカーとパソコンの通信はXbeeを使っています。
Diff: main.cpp
- Revision:
- 6:2ce8f719d84d
- Parent:
- 5:7f85cf99d0f6
--- a/main.cpp Tue May 08 11:20:33 2012 +0000 +++ b/main.cpp Thu Oct 11 14:11:34 2012 +0000 @@ -15,31 +15,24 @@ #include "mbed.h" #include "CameraC1098.h" -#include "SDFileSystem.h" +#include "TextLCD.h" /* * Definitions. */ -#define USE_SD_CARD 1 +TextLCD lcd(p24, p26, p27, p28, p29, p30); +CameraC1098 camera(p9, p10); /* * Variables. */ -static const int CAPTURE_FRAMES = 3; -static char buf[1024+1]; -static FILE *fp_jpeg; +PwmOut steering(p25) ; +PwmOut speed_in1(p22) ; +PwmOut speed_in2(p23) ; +Serial pc(p13,p14); -/* - * Modules. - */ -#if USE_SD_CARD -SDFileSystem sd(p5, p6, p7, p8, "fs"); -#else -LocalFileSystem fs("fs"); -#endif - -CameraC1098 camera(p9, p10); - +static char buf[256+1]; +volatile char steer; /** * A callback function for jpeg images. @@ -50,7 +43,7 @@ */ void jpeg_callback(char *buf, size_t siz) { for (int i = 0; i < (int)siz; i++) { - fprintf(fp_jpeg, "%c", buf[i]); + pc.putc(buf[i]) ; } } @@ -61,10 +54,13 @@ CameraC1098::ErrorNumber err = CameraC1098::NoError; err = camera.sync(); + lcd.locate(0,0); if (CameraC1098::NoError == err) { printf("[ OK ] : CameraC1098::sync\r\n"); + lcd.printf("Camera Sync [OK]"); } else { printf("[FAIL] : CameraC1098::sync (Error=%02X)\r\n", (int)err); + lcd.printf("Camera init [NG]"); } } @@ -74,41 +70,121 @@ */ void test_jpeg_snapshot_picture(void) { CameraC1098::ErrorNumber err = CameraC1098::NoError; - for (int i = 0; i < CAPTURE_FRAMES; i++) { - char fname[64]; - snprintf(fname, sizeof(fname), "/fs/jpss%04d.jpg", i); - fp_jpeg = fopen(fname, "w"); + + err = camera.getJpegSnapshotPicture(jpeg_callback); - err = camera.getJpegSnapshotPicture(jpeg_callback); - - if (CameraC1098::NoError == err) { - printf("[ OK ] : CameraC1098::getJpegSnapshotPicture\r\n"); - } else { - printf("[FAIL] : CameraC1098::getJpegSnapshotPicture (Error=%02X)\r\n", (int)err); - } - fclose(fp_jpeg); + lcd.locate(0,0); + if (CameraC1098::NoError == err) { + printf("[ OK ] : CameraC1098::getJpegSnapshotPicture\r\n"); + lcd.printf("Camera send [OK]"); + } else { + printf("[FAIL] : CameraC1098::getJpegSnapshotPicture (Error=%02X)\r\n", (int)err); + lcd.printf("Camera send [NG]"); } } -/** - * A entry point. - */ +void rxFunc(){ + steer = pc.getc(); +} + int main() { + float sp1, sp2; + int st; + + wait(2.0) ; + pc.attach(&rxFunc,Serial::RxIrq); + printf("\r\n"); printf("==========\r\n"); printf("CameraC1098\r\n"); printf("==========\r\n"); CameraC1098::ErrorNumber err = CameraC1098::NoError; - err = camera.init(CameraC1098::Baud28800, CameraC1098::JpegResolution80x64); - + err = camera.init(CameraC1098::Baud115200, CameraC1098::JpegResolution160x128); + camera.setmbedBaud( CameraC1098::Baud115200 ); + pc.baud(115200); + + + lcd.locate(0,0); if (CameraC1098::NoError == err) { printf("[ OK ] : CameraC1098::init\r\n") ; + lcd.printf("Camera init [OK]"); } else { printf("[FAIL] : CameraC1098::init (Error=%02X)\r\n", (int)err) ; + lcd.printf("Camera init[NG]"); + exit(-1); } // - sync(); - test_jpeg_snapshot_picture(); + sync(); + + steering.period(0.020); + speed_in1.period(0.1) ; + speed_in2.period(0.1) ; + + while(1){ - return 0; + lcd.locate(0,1); + switch(steer){ + case 'S': + lcd.printf("pictshort "); + test_jpeg_snapshot_picture(); + break; + case '0': + lcd.printf(" "); + st = 1500; + sp1 = 0.0f ; + sp2 = 0.0f ; + break; + case '1': + lcd.printf("FORWARD "); + st = 1500; + sp1 = 0.7f ; + sp2 = 0.0f ; + break; + case '2': + lcd.printf("BACK "); + st = 1500; + sp1 = 0.0f ; + sp2 = 0.7f ; + break; + case '6': + lcd.printf("FORWARD+LEFT "); + st = 1200; + sp1 = 0.7f ; + sp2 = 0.0f ; + break; + case '7': + lcd.printf("FORWARD+RIGHT "); + st = 1800; + sp1 = 0.7f ; + sp2 = 0.0f ; + break; + case 'A': + lcd.printf("BACK+LEFT "); + st = 1200; + sp1 = 0.0f ; + sp2 = 0.7f ; + break; + case 'B': + lcd.printf("BACK+RIGHT "); + st = 1800; + sp1 = 0.0f ; + sp2 = 0.7f ; + break; + case 'F': + lcd.printf("STOP "); + st = 1500; + sp1 = 0.0 ; + sp2 = 0.0 ; + break; + default: + lcd.printf(" "); + st = 1500; + sp1 = 0.0 ; + sp2 = 0.0 ; + } + steering.pulsewidth_us(st); + speed_in1.write(sp1) ; + speed_in2.write(sp2) ; + } + }