エレキジャック Web版 マイコン・カーを製作してみよう<21> マイコンカー制御プログラムです。http://www.eleki-jack.com/arm/2012/10/21.html  このプログラムは次回の記事でアップされるパソコン用プログラムを使ってマイコンカーを制御するプログラムです。マイコンカーとパソコンの通信はXbeeを使っています。

Dependencies:   TextLCD mbed

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) ;   
+    }
+                
 }