エレキジャック Web版 マイコン・カーを製作してみよう<21> マイコンカー制御プログラムです。http://www.eleki-jack.com/arm/2012/10/21.html このプログラムは次回の記事でアップされるパソコン用プログラムを使ってマイコンカーを制御するプログラムです。マイコンカーとパソコンの通信はXbeeを使っています。
main.cpp@7:1a0580ace499, 2012-10-11 (annotated)
- Committer:
- sunifu
- Date:
- Thu Oct 11 14:11:54 2012 +0000
- Revision:
- 7:1a0580ace499
- Parent:
- 6:2ce8f719d84d
ver1.0
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
sunifu | 0:6eaa311b9d3b | 1 | /** |
sunifu | 0:6eaa311b9d3b | 2 | * Test program. |
sunifu | 0:6eaa311b9d3b | 3 | * |
sunifu | 3:ba97046adcd1 | 4 | * CameraC328Library |
sunifu | 0:6eaa311b9d3b | 5 | * Copyright (C) 2010 Shinichiro Nakamura (CuBeatSystems) |
sunifu | 0:6eaa311b9d3b | 6 | * http://shinta.main.jp/ |
sunifu | 3:ba97046adcd1 | 7 | * |
sunifu | 3:ba97046adcd1 | 8 | * CameraC1098-SS Library |
sunifu | 3:ba97046adcd1 | 9 | * Copyright (C) 2012 Tadao Iida |
sunifu | 0:6eaa311b9d3b | 10 | */ |
sunifu | 0:6eaa311b9d3b | 11 | |
sunifu | 0:6eaa311b9d3b | 12 | /* |
sunifu | 0:6eaa311b9d3b | 13 | * Include files. |
sunifu | 0:6eaa311b9d3b | 14 | */ |
sunifu | 0:6eaa311b9d3b | 15 | |
sunifu | 0:6eaa311b9d3b | 16 | #include "mbed.h" |
sunifu | 0:6eaa311b9d3b | 17 | #include "CameraC1098.h" |
sunifu | 6:2ce8f719d84d | 18 | #include "TextLCD.h" |
sunifu | 0:6eaa311b9d3b | 19 | |
sunifu | 0:6eaa311b9d3b | 20 | /* |
sunifu | 0:6eaa311b9d3b | 21 | * Definitions. |
sunifu | 0:6eaa311b9d3b | 22 | */ |
sunifu | 6:2ce8f719d84d | 23 | TextLCD lcd(p24, p26, p27, p28, p29, p30); |
sunifu | 6:2ce8f719d84d | 24 | CameraC1098 camera(p9, p10); |
sunifu | 0:6eaa311b9d3b | 25 | |
sunifu | 0:6eaa311b9d3b | 26 | /* |
sunifu | 0:6eaa311b9d3b | 27 | * Variables. |
sunifu | 0:6eaa311b9d3b | 28 | */ |
sunifu | 6:2ce8f719d84d | 29 | PwmOut steering(p25) ; |
sunifu | 6:2ce8f719d84d | 30 | PwmOut speed_in1(p22) ; |
sunifu | 6:2ce8f719d84d | 31 | PwmOut speed_in2(p23) ; |
sunifu | 6:2ce8f719d84d | 32 | Serial pc(p13,p14); |
sunifu | 0:6eaa311b9d3b | 33 | |
sunifu | 6:2ce8f719d84d | 34 | static char buf[256+1]; |
sunifu | 6:2ce8f719d84d | 35 | volatile char steer; |
sunifu | 0:6eaa311b9d3b | 36 | |
sunifu | 0:6eaa311b9d3b | 37 | /** |
sunifu | 0:6eaa311b9d3b | 38 | * A callback function for jpeg images. |
sunifu | 0:6eaa311b9d3b | 39 | * You can block this function until saving the image datas. |
sunifu | 0:6eaa311b9d3b | 40 | * |
sunifu | 0:6eaa311b9d3b | 41 | * @param buf A pointer to the image buffer. |
sunifu | 0:6eaa311b9d3b | 42 | * @param siz A size of the image buffer. |
sunifu | 0:6eaa311b9d3b | 43 | */ |
sunifu | 0:6eaa311b9d3b | 44 | void jpeg_callback(char *buf, size_t siz) { |
sunifu | 0:6eaa311b9d3b | 45 | for (int i = 0; i < (int)siz; i++) { |
sunifu | 6:2ce8f719d84d | 46 | pc.putc(buf[i]) ; |
sunifu | 0:6eaa311b9d3b | 47 | } |
sunifu | 0:6eaa311b9d3b | 48 | } |
sunifu | 0:6eaa311b9d3b | 49 | |
sunifu | 0:6eaa311b9d3b | 50 | /** |
sunifu | 0:6eaa311b9d3b | 51 | * Synchronizing. |
sunifu | 0:6eaa311b9d3b | 52 | */ |
sunifu | 0:6eaa311b9d3b | 53 | void sync(void) { |
sunifu | 0:6eaa311b9d3b | 54 | CameraC1098::ErrorNumber err = CameraC1098::NoError; |
sunifu | 0:6eaa311b9d3b | 55 | |
sunifu | 0:6eaa311b9d3b | 56 | err = camera.sync(); |
sunifu | 6:2ce8f719d84d | 57 | lcd.locate(0,0); |
sunifu | 0:6eaa311b9d3b | 58 | if (CameraC1098::NoError == err) { |
sunifu | 0:6eaa311b9d3b | 59 | printf("[ OK ] : CameraC1098::sync\r\n"); |
sunifu | 6:2ce8f719d84d | 60 | lcd.printf("Camera Sync [OK]"); |
sunifu | 0:6eaa311b9d3b | 61 | } else { |
sunifu | 0:6eaa311b9d3b | 62 | printf("[FAIL] : CameraC1098::sync (Error=%02X)\r\n", (int)err); |
sunifu | 6:2ce8f719d84d | 63 | lcd.printf("Camera init [NG]"); |
sunifu | 0:6eaa311b9d3b | 64 | } |
sunifu | 0:6eaa311b9d3b | 65 | } |
sunifu | 0:6eaa311b9d3b | 66 | |
sunifu | 0:6eaa311b9d3b | 67 | |
sunifu | 0:6eaa311b9d3b | 68 | /** |
sunifu | 0:6eaa311b9d3b | 69 | * A test function for jpeg snapshot picture. |
sunifu | 0:6eaa311b9d3b | 70 | */ |
sunifu | 0:6eaa311b9d3b | 71 | void test_jpeg_snapshot_picture(void) { |
sunifu | 0:6eaa311b9d3b | 72 | CameraC1098::ErrorNumber err = CameraC1098::NoError; |
sunifu | 6:2ce8f719d84d | 73 | |
sunifu | 6:2ce8f719d84d | 74 | err = camera.getJpegSnapshotPicture(jpeg_callback); |
sunifu | 0:6eaa311b9d3b | 75 | |
sunifu | 6:2ce8f719d84d | 76 | lcd.locate(0,0); |
sunifu | 6:2ce8f719d84d | 77 | if (CameraC1098::NoError == err) { |
sunifu | 6:2ce8f719d84d | 78 | printf("[ OK ] : CameraC1098::getJpegSnapshotPicture\r\n"); |
sunifu | 6:2ce8f719d84d | 79 | lcd.printf("Camera send [OK]"); |
sunifu | 6:2ce8f719d84d | 80 | } else { |
sunifu | 6:2ce8f719d84d | 81 | printf("[FAIL] : CameraC1098::getJpegSnapshotPicture (Error=%02X)\r\n", (int)err); |
sunifu | 6:2ce8f719d84d | 82 | lcd.printf("Camera send [NG]"); |
sunifu | 0:6eaa311b9d3b | 83 | } |
sunifu | 0:6eaa311b9d3b | 84 | } |
sunifu | 0:6eaa311b9d3b | 85 | |
sunifu | 6:2ce8f719d84d | 86 | void rxFunc(){ |
sunifu | 6:2ce8f719d84d | 87 | steer = pc.getc(); |
sunifu | 6:2ce8f719d84d | 88 | } |
sunifu | 6:2ce8f719d84d | 89 | |
sunifu | 0:6eaa311b9d3b | 90 | int main() { |
sunifu | 6:2ce8f719d84d | 91 | float sp1, sp2; |
sunifu | 6:2ce8f719d84d | 92 | int st; |
sunifu | 6:2ce8f719d84d | 93 | |
sunifu | 6:2ce8f719d84d | 94 | wait(2.0) ; |
sunifu | 6:2ce8f719d84d | 95 | pc.attach(&rxFunc,Serial::RxIrq); |
sunifu | 6:2ce8f719d84d | 96 | |
sunifu | 0:6eaa311b9d3b | 97 | printf("\r\n"); |
sunifu | 2:9758930faa7e | 98 | printf("==========\r\n"); |
sunifu | 0:6eaa311b9d3b | 99 | printf("CameraC1098\r\n"); |
sunifu | 0:6eaa311b9d3b | 100 | printf("==========\r\n"); |
sunifu | 0:6eaa311b9d3b | 101 | CameraC1098::ErrorNumber err = CameraC1098::NoError; |
sunifu | 6:2ce8f719d84d | 102 | err = camera.init(CameraC1098::Baud115200, CameraC1098::JpegResolution160x128); |
sunifu | 6:2ce8f719d84d | 103 | camera.setmbedBaud( CameraC1098::Baud115200 ); |
sunifu | 6:2ce8f719d84d | 104 | pc.baud(115200); |
sunifu | 6:2ce8f719d84d | 105 | |
sunifu | 6:2ce8f719d84d | 106 | |
sunifu | 6:2ce8f719d84d | 107 | lcd.locate(0,0); |
sunifu | 0:6eaa311b9d3b | 108 | if (CameraC1098::NoError == err) { |
sunifu | 5:7f85cf99d0f6 | 109 | printf("[ OK ] : CameraC1098::init\r\n") ; |
sunifu | 6:2ce8f719d84d | 110 | lcd.printf("Camera init [OK]"); |
sunifu | 0:6eaa311b9d3b | 111 | } else { |
sunifu | 5:7f85cf99d0f6 | 112 | printf("[FAIL] : CameraC1098::init (Error=%02X)\r\n", (int)err) ; |
sunifu | 6:2ce8f719d84d | 113 | lcd.printf("Camera init[NG]"); |
sunifu | 6:2ce8f719d84d | 114 | exit(-1); |
sunifu | 0:6eaa311b9d3b | 115 | } |
sunifu | 4:887ced27d5d6 | 116 | // |
sunifu | 6:2ce8f719d84d | 117 | sync(); |
sunifu | 6:2ce8f719d84d | 118 | |
sunifu | 6:2ce8f719d84d | 119 | steering.period(0.020); |
sunifu | 6:2ce8f719d84d | 120 | speed_in1.period(0.1) ; |
sunifu | 6:2ce8f719d84d | 121 | speed_in2.period(0.1) ; |
sunifu | 6:2ce8f719d84d | 122 | |
sunifu | 6:2ce8f719d84d | 123 | while(1){ |
sunifu | 0:6eaa311b9d3b | 124 | |
sunifu | 6:2ce8f719d84d | 125 | lcd.locate(0,1); |
sunifu | 6:2ce8f719d84d | 126 | switch(steer){ |
sunifu | 6:2ce8f719d84d | 127 | case 'S': |
sunifu | 6:2ce8f719d84d | 128 | lcd.printf("pictshort "); |
sunifu | 6:2ce8f719d84d | 129 | test_jpeg_snapshot_picture(); |
sunifu | 6:2ce8f719d84d | 130 | break; |
sunifu | 6:2ce8f719d84d | 131 | case '0': |
sunifu | 6:2ce8f719d84d | 132 | lcd.printf(" "); |
sunifu | 6:2ce8f719d84d | 133 | st = 1500; |
sunifu | 6:2ce8f719d84d | 134 | sp1 = 0.0f ; |
sunifu | 6:2ce8f719d84d | 135 | sp2 = 0.0f ; |
sunifu | 6:2ce8f719d84d | 136 | break; |
sunifu | 6:2ce8f719d84d | 137 | case '1': |
sunifu | 6:2ce8f719d84d | 138 | lcd.printf("FORWARD "); |
sunifu | 6:2ce8f719d84d | 139 | st = 1500; |
sunifu | 6:2ce8f719d84d | 140 | sp1 = 0.7f ; |
sunifu | 6:2ce8f719d84d | 141 | sp2 = 0.0f ; |
sunifu | 6:2ce8f719d84d | 142 | break; |
sunifu | 6:2ce8f719d84d | 143 | case '2': |
sunifu | 6:2ce8f719d84d | 144 | lcd.printf("BACK "); |
sunifu | 6:2ce8f719d84d | 145 | st = 1500; |
sunifu | 6:2ce8f719d84d | 146 | sp1 = 0.0f ; |
sunifu | 6:2ce8f719d84d | 147 | sp2 = 0.7f ; |
sunifu | 6:2ce8f719d84d | 148 | break; |
sunifu | 6:2ce8f719d84d | 149 | case '6': |
sunifu | 6:2ce8f719d84d | 150 | lcd.printf("FORWARD+LEFT "); |
sunifu | 6:2ce8f719d84d | 151 | st = 1200; |
sunifu | 6:2ce8f719d84d | 152 | sp1 = 0.7f ; |
sunifu | 6:2ce8f719d84d | 153 | sp2 = 0.0f ; |
sunifu | 6:2ce8f719d84d | 154 | break; |
sunifu | 6:2ce8f719d84d | 155 | case '7': |
sunifu | 6:2ce8f719d84d | 156 | lcd.printf("FORWARD+RIGHT "); |
sunifu | 6:2ce8f719d84d | 157 | st = 1800; |
sunifu | 6:2ce8f719d84d | 158 | sp1 = 0.7f ; |
sunifu | 6:2ce8f719d84d | 159 | sp2 = 0.0f ; |
sunifu | 6:2ce8f719d84d | 160 | break; |
sunifu | 6:2ce8f719d84d | 161 | case 'A': |
sunifu | 6:2ce8f719d84d | 162 | lcd.printf("BACK+LEFT "); |
sunifu | 6:2ce8f719d84d | 163 | st = 1200; |
sunifu | 6:2ce8f719d84d | 164 | sp1 = 0.0f ; |
sunifu | 6:2ce8f719d84d | 165 | sp2 = 0.7f ; |
sunifu | 6:2ce8f719d84d | 166 | break; |
sunifu | 6:2ce8f719d84d | 167 | case 'B': |
sunifu | 6:2ce8f719d84d | 168 | lcd.printf("BACK+RIGHT "); |
sunifu | 6:2ce8f719d84d | 169 | st = 1800; |
sunifu | 6:2ce8f719d84d | 170 | sp1 = 0.0f ; |
sunifu | 6:2ce8f719d84d | 171 | sp2 = 0.7f ; |
sunifu | 6:2ce8f719d84d | 172 | break; |
sunifu | 6:2ce8f719d84d | 173 | case 'F': |
sunifu | 6:2ce8f719d84d | 174 | lcd.printf("STOP "); |
sunifu | 6:2ce8f719d84d | 175 | st = 1500; |
sunifu | 6:2ce8f719d84d | 176 | sp1 = 0.0 ; |
sunifu | 6:2ce8f719d84d | 177 | sp2 = 0.0 ; |
sunifu | 6:2ce8f719d84d | 178 | break; |
sunifu | 6:2ce8f719d84d | 179 | default: |
sunifu | 6:2ce8f719d84d | 180 | lcd.printf(" "); |
sunifu | 6:2ce8f719d84d | 181 | st = 1500; |
sunifu | 6:2ce8f719d84d | 182 | sp1 = 0.0 ; |
sunifu | 6:2ce8f719d84d | 183 | sp2 = 0.0 ; |
sunifu | 6:2ce8f719d84d | 184 | } |
sunifu | 6:2ce8f719d84d | 185 | steering.pulsewidth_us(st); |
sunifu | 6:2ce8f719d84d | 186 | speed_in1.write(sp1) ; |
sunifu | 6:2ce8f719d84d | 187 | speed_in2.write(sp2) ; |
sunifu | 6:2ce8f719d84d | 188 | } |
sunifu | 6:2ce8f719d84d | 189 | |
sunifu | 0:6eaa311b9d3b | 190 | } |