エレキジャック Web版 マイコン・カーを製作してみよう<21> マイコンカー制御プログラムです。http://www.eleki-jack.com/arm/2012/10/21.html このプログラムは次回の記事でアップされるパソコン用プログラムを使ってマイコンカーを制御するプログラムです。マイコンカーとパソコンの通信はXbeeを使っています。
main.cpp
- Committer:
- sunifu
- Date:
- 2012-10-11
- Revision:
- 7:1a0580ace499
- Parent:
- 6:2ce8f719d84d
File content as of revision 7:1a0580ace499:
/** * Test program. * * CameraC328Library * Copyright (C) 2010 Shinichiro Nakamura (CuBeatSystems) * http://shinta.main.jp/ * * CameraC1098-SS Library * Copyright (C) 2012 Tadao Iida */ /* * Include files. */ #include "mbed.h" #include "CameraC1098.h" #include "TextLCD.h" /* * Definitions. */ TextLCD lcd(p24, p26, p27, p28, p29, p30); CameraC1098 camera(p9, p10); /* * Variables. */ PwmOut steering(p25) ; PwmOut speed_in1(p22) ; PwmOut speed_in2(p23) ; Serial pc(p13,p14); static char buf[256+1]; volatile char steer; /** * A callback function for jpeg images. * You can block this function until saving the image datas. * * @param buf A pointer to the image buffer. * @param siz A size of the image buffer. */ void jpeg_callback(char *buf, size_t siz) { for (int i = 0; i < (int)siz; i++) { pc.putc(buf[i]) ; } } /** * Synchronizing. */ void sync(void) { 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]"); } } /** * A test function for jpeg snapshot picture. */ void test_jpeg_snapshot_picture(void) { CameraC1098::ErrorNumber err = CameraC1098::NoError; err = camera.getJpegSnapshotPicture(jpeg_callback); 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]"); } } 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::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(); steering.period(0.020); speed_in1.period(0.1) ; speed_in2.period(0.1) ; while(1){ 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) ; } }