Class導入前です まだできてません

Dependencies:   mbed CameraUS015sb612-3

Files at this revision

API Documentation at this revision

Comitter:
YUPPY
Date:
Wed Nov 20 08:06:46 2019 +0000
Parent:
3:5d0c4b13f4e8
Commit message:
class_before_loading;

Changed in this revision

CameraUS015sb612-3.lib Show annotated file Show diff for this revision Revisions of this file
JPEGCamera.cpp Show annotated file Show diff for this revision Revisions of this file
JPEGCamera.h Show annotated file Show diff for this revision Revisions of this file
TB6612.cpp Show annotated file Show diff for this revision Revisions of this file
base64.cpp Show annotated file Show diff for this revision Revisions of this file
base64.h Show annotated file Show diff for this revision Revisions of this file
getGPS.cpp Show annotated file Show diff for this revision Revisions of this file
main.cpp Show annotated file Show diff for this revision Revisions of this file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/CameraUS015sb612-3.lib	Wed Nov 20 08:06:46 2019 +0000
@@ -0,0 +1,1 @@
+https://os.mbed.com/users/YUPPY/code/CameraUS015sb612-3/#5f9c4d16acf6
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/JPEGCamera.cpp	Wed Nov 20 08:06:46 2019 +0000
@@ -0,0 +1,144 @@
+/* Arduino JPEGCamera Library
+ * Copyright 2010 SparkFun Electronic
+ * Written by Ryan Owens
+ * Modified by arms22
+ * Ported to mbed by yamaguch
+ */
+
+#include "JPEGCamera.h"
+
+#define min(x, y) ((x) < (y)) ? (x) : (y)
+
+const int RESPONSE_TIMEOUT = 500;
+const int DATA_TIMEOUT = 1000;
+
+JPEGCamera::JPEGCamera(PinName tx, PinName rx) : Serial(tx, rx) {
+    printf("AA\r\n");
+    baud(38400);
+    state = READY;
+}
+
+bool JPEGCamera::setPictureSize(JPEGCamera::PictureSize size, bool doReset) {
+    char buf[9] = {0x56, 0x00, 0x31, 0x05, 0x04, 0x01, 0x00, 0x19, (char) size};
+    int ret = sendReceive(buf, sizeof buf, 5);
+
+    if (ret == 5 && buf[0] == 0x76) {
+        if (doReset)
+            reset();
+        return true;
+    } else
+        return false;
+}
+
+bool JPEGCamera::isReady() {
+    return state == READY;
+}
+
+bool JPEGCamera::isProcessing() {
+    return state == PROCESSING;
+}
+
+bool JPEGCamera::takePicture(char *filename) {
+    if (state == READY) {
+        fp = fopen(filename, "wb");
+        if (fp != 0) {
+            if (takePicture()) {
+                imageSize = getImageSize();
+                address = 0;
+                state = PROCESSING;
+            } else {
+                fclose(fp);
+                printf("takePicture(%s) failed", filename);
+                state = ERROR;
+            }
+        } else {
+            printf("fopen() failed");
+            state = ERROR;
+        }
+    }
+    return state != ERROR;
+}
+
+bool JPEGCamera::processPicture() {
+    if (state == PROCESSING) {
+        if (address < imageSize) {
+            char data[1024];
+            int size = readData(data, min(sizeof(data), imageSize - address), address);
+            int ret = fwrite(data, size, 1, fp);
+            if (ret > 0)
+                address += size;
+            if (ret == 0 || address >= imageSize) {
+                stopPictures();
+                fclose(fp);
+                wait(0.1); // ????
+                state = ret > 0 ? READY : ERROR;
+            }
+        }
+    }
+
+    return state == PROCESSING || state == READY;
+}
+
+bool JPEGCamera::reset() {
+    char buf[4] = {0x56, 0x00, 0x26, 0x00};
+    int ret = sendReceive(buf, sizeof buf, 4);
+    if (ret == 4 && buf[0] == 0x76) {
+        wait(4.0);
+        state = READY;
+    } else {
+        state = ERROR;
+    }
+    return state == READY;
+}
+
+bool JPEGCamera::takePicture() {
+    char buf[5] = {0x56, 0x00, 0x36, 0x01, 0x00};
+    int ret = sendReceive(buf, sizeof buf, 5);
+
+    return ret == 5 && buf[0] == 0x76;
+}
+
+bool JPEGCamera::stopPictures() {
+    char buf[5] = {0x56, 0x00, 0x36, 0x01, 0x03};
+    int ret = sendReceive(buf, sizeof buf, 5);
+
+    return ret == 4 && buf[0] == 0x76;
+}
+
+int JPEGCamera::getImageSize() {
+    char buf[9] = {0x56, 0x00, 0x34, 0x01, 0x00};
+    int ret = sendReceive(buf, sizeof buf, 9);
+
+    //The size is in the last 2 characters of the response.
+    return (ret == 9 && buf[0] == 0x76) ? (buf[7] << 8 | buf[8]) : 0;
+}
+
+int JPEGCamera::readData(char *dataBuf, int size, int address) {
+    char buf[16] = {0x56, 0x00, 0x32, 0x0C, 0x00, 0x0A, 0x00, 0x00,
+                    address >> 8, address & 255, 0x00, 0x00, size >> 8, size & 255, 0x00, 0x0A
+                   };
+    int ret = sendReceive(buf, sizeof buf, 5);
+
+    return (ret == 5 && buf[0] == 0x76) ? receive(dataBuf, size, DATA_TIMEOUT) : 0;
+}
+
+int JPEGCamera::sendReceive(char *buf, int sendSize, int receiveSize) {
+    while (readable()) getc();
+
+    for (int i = 0; i < sendSize; i++) putc(buf[i]);
+
+    return receive(buf, receiveSize, RESPONSE_TIMEOUT);
+}
+
+int JPEGCamera::receive(char *buf, int size, int timeout) {
+    timer.start();
+    timer.reset();
+
+    int i = 0;
+    while (i < size && timer.read_ms() < timeout) {
+        if (readable())
+            buf[i++] = getc();
+    }
+
+    return i;
+}
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/JPEGCamera.h	Wed Nov 20 08:06:46 2019 +0000
@@ -0,0 +1,122 @@
+
+/* Arduino JPEGCamera Library
+ * Copyright 2010 SparkFun Electronics
+ * Written by Ryan Owens
+ * Modified by arms22
+ * Ported to mbed by yamaguch
+ */
+
+#ifndef JPEG_CAMERA_H
+#define JPEG_CAMERA_H
+
+#include "mbed.h"
+
+/**
+ * Interface for LinkSprite JPEG Camera module LS-Y201
+ */
+class JPEGCamera : public Serial {
+public:
+    /***/
+    enum PictureSize {
+        SIZE160x120 = 0x22,
+        SIZE320x240 = 0x11,
+        SIZE640x480 = 0x00,
+    };
+
+    /**
+     * Create JPEG Camera
+     *
+     * @param tx tx pin
+     * @param rx rx pin
+     */
+    JPEGCamera(PinName tx, PinName rx);
+
+    /**
+     * Set picture size
+     *
+     * @param size picture size (available sizes are SIZE160x120, SIZE320x240, SIZE640x480)
+     * @param doReset flag to perform reset operation after changing size
+     *
+     * @returns true if succeeded, false otherwise
+     */
+    bool setPictureSize(JPEGCamera::PictureSize size, bool doReset = true);
+
+    /**
+     * Return whether camera is ready or not
+     *
+     * @returns true if ready, false otherwise
+     */
+    bool isReady();
+
+    /**
+     * Return whether camera is processing the taken picture or not
+     *
+     * @returns true if the camera is in processing, false otherwise
+     */
+    bool isProcessing();
+
+    /**
+     * Take a picture
+     *
+     * @param filename filename to store the picture data
+     * @returns true if succeeded, false otherwise
+     */
+    bool takePicture(char *filename);
+    /**
+     * Process picture (writing the file)
+     *
+     * @returns true if no error in processing, false otherwise
+     */
+    bool processPicture();
+
+    /**
+     * Perform reset oepration (it takes 4 seconds)
+     *
+     * @returns true if succeeded, false otherwise
+     */
+    bool reset();
+
+    /**
+     * Send a picture command to the camera module
+     *
+     *  @returns true if succeeded, false otherwise
+     */
+    bool takePicture(void);
+
+    /**
+     * Send a stop pictures command to the camera module
+     *
+     *  @returns true if succeeded, false otherwise
+     */
+    bool stopPictures(void);
+
+    /**
+     * Get the picture image size
+     *
+     * @returns the actual image size in bytes
+     */
+    int getImageSize();
+
+    /**
+     * Read the picture data to the buffer
+     *
+     * @param dataBuf data buffer address to store the received data
+     * @param size data size to read
+     * @param address the address of the picture data to read
+     *
+     * @returns the size of the data read
+     */
+    int readData(char *dataBuf, int size, int address);
+
+//private:
+    Timer timer;
+    FILE *fp;
+    int imageSize;
+    int address;
+    enum State {UNKNOWN, READY, PROCESSING, ERROR = -1} state;
+    
+    int sendReceive(char *buf, int sendSize, int receiveSize);
+    int receive(char *buf, int size, int timeout);
+};
+
+#endif
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/TB6612.cpp	Wed Nov 20 08:06:46 2019 +0000
@@ -0,0 +1,57 @@
+/**
+ * Motor Driver TB6612 Control Library
+ *
+ * -- TB6612 is a device of the TOSHIBA. 
+ *
+ * Copyright (C) 2012 Junichi Katsu (JKSOFT) 
+ */
+ 
+ 
+#include "TB6612.h"
+ 
+// TB6612 Class Constructor
+TB6612::TB6612(PinName pwm, PinName fwd, PinName rev):
+        _pwm(pwm), _fwd(fwd), _rev(rev) {
+ 
+    _fwd = 0;
+    _rev = 0;
+    _pwm = 0.0;
+    _pwm.period(0.001);
+}
+ 
+// Speed Control
+//  arg
+//   int speed -100 -- 0 -- 100
+void TB6612::speed(int speed) {
+        
+    if( speed > 0 )
+    {
+        _pwm = ((float)speed) / 100.0;
+        _fwd = 1;
+        _rev = 0;
+    }
+    else if( speed < 0 )
+    {
+        _pwm = -((float)speed) / 100.0;
+        _fwd = 0;
+        _rev = 1;
+    }
+    else
+    {
+        _fwd = 1;
+        _rev = 1;
+    }
+}
+ 
+ 
+// Speed Control with time-out
+//  arg
+//   int speed -100 -- 0 -- 100
+//   int time  0
+void TB6612::move(int sspeed , int time)
+{
+    speed(sspeed);
+    wait_ms(time);
+}
+ 
+            
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/base64.cpp	Wed Nov 20 08:06:46 2019 +0000
@@ -0,0 +1,180 @@
+#include "base64.h"
+
+const char *base64::szB64 = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=";
+
+base64::base64() : lpszOutputString(NULL)
+{
+}
+
+base64::~base64()
+{
+    if(lpszOutputString)
+        delete[] lpszOutputString;
+}
+
+const char *base64::Encode(const char *szStr, int iLens)
+{
+    int i,j;
+
+    if(lpszOutputString)
+        delete[] lpszOutputString;
+
+    if(iLens == -1)
+        iLen = strlen(szStr);
+    else
+        iLen = iLens;
+
+    lpszOutputString =
+        new char[(int)((double)(iLen)*1.5)+10];
+    for(i = 0,j = 0; i < (iLen - (iLen % 3)); i+=3)
+    {
+        lpszOutputString[j] = szB64[(szStr[i] & 0xfc) >> 2];
+        lpszOutputString[j+1] = szB64[((szStr[i] &0x03) << 4) |
+                                    ((szStr[i+1] & 0xf0) >> 4)];
+        lpszOutputString[j+2] = szB64[((szStr[i+1] & 0x0f) <<2 ) |
+                                    ((szStr[i+2] & 0xc0) >> 6)];
+        lpszOutputString[j+3] = szB64[(szStr[i+2] & 0x3f)];
+        j += 4;
+    }
+    i = iLen-(iLen % 3);    // 残りのサイズを計算
+    switch(iLen % 3)
+    {
+    case 2: // 1文字分パディングが必要
+    {
+        lpszOutputString[j] = szB64[(szStr[i] & 0xfc) >> 2];
+        lpszOutputString[j+1] = szB64[((szStr[i] &0x03) << 4) |
+                                    ((szStr[i+1] & 0xf0) >> 4)];
+        lpszOutputString[j+2] = szB64[((szStr[i+1] & 0x0f) <<2 )];
+        lpszOutputString[j+3] = szB64[64];  // Pad
+        lpszOutputString[j+4] = '\0';
+    }
+    break;
+    case 1: // 2文字分パディングが必要
+    {
+        lpszOutputString[j] = szB64[(szStr[i] & 0xfc) >> 2];
+        lpszOutputString[j+1] = szB64[((szStr[i] &0x03) << 4)];
+        lpszOutputString[j+2] = szB64[64];  // Pad
+        lpszOutputString[j+3] = szB64[64];  // Pad
+        lpszOutputString[j+4] = '\0';
+    }
+    break;
+    }
+    lpszOutputString[j+4] = '\0';
+
+    return lpszOutputString;
+}
+
+void base64::Encode(istream& istr, ostream& ostr, int iRet)
+{
+    int i;
+    char c[3];
+
+    i = 0;
+    while(!istr.eof())
+    {
+        c[0] = c[1] = c[2] = '\0';
+        istr.read(c,3);
+
+        ostr << szB64[(c[0] & 0xfc) >> 2];
+        i++;    if(i >= iRet && iRet != -1){ ostr << endl; i = 0; }
+        ostr << szB64[((c[0] &0x03) << 4) | ((c[1] & 0xf0) >> 4)];
+        i++;    if(i >= iRet && iRet != -1){ ostr << endl; i = 0; }
+        if(istr.gcount() == 1)
+            ostr << szB64[64];
+        else
+            ostr << szB64[((c[1] & 0x0f) <<2 ) | ((c[2] & 0xc0) >> 6)];
+        i++;    if(i >= iRet && iRet != -1){ ostr << endl; i = 0; }
+        if(istr.gcount() == 3)
+            ostr << szB64[(c[2] & 0x3f)];
+        else
+            ostr << szB64[64];
+        i++;    if(i >= iRet && iRet != -1){ ostr << endl; i = 0; }
+    }
+    ostr.flush();
+}
+
+
+int base64::FindIndexInB64(char c)
+{
+    int index = 0;
+    while(szB64[index] != '\0' && szB64[index] != c)
+        index++;
+
+    if(szB64[index] == '\0')
+        return -1;  // 見つからず
+
+    return index;   // 見つかった。
+}
+
+const char *base64::Decode(const char *szStr)
+{
+    //lpszOutputString
+    int i, j, l,iWriteCount,len;
+    char c;
+    char buf[4];
+
+    len = iLen = strlen(szStr);
+    if(lpszOutputString)
+        delete[] lpszOutputString;
+
+    iLen = (int)(((double)(iLen)/4.0)*3.0) + 4;
+
+    lpszOutputString = new char[iLen];
+
+    for(i = 0, j = 0; i < len; i+=4)
+    {
+        iWriteCount = 3;
+        for(l = 0; l < 4 && i+l<len; l++)
+        {
+            c = szStr[i+l];
+            if(c == szB64[64])  // Pad
+                iWriteCount--;
+            else {
+                buf[l] = FindIndexInB64(c);
+                //if(buf[l] == -1) error!;
+            }
+        }
+        lpszOutputString[j] = ((buf[0] << 2) & 0xfc) | ((buf[1] >> 4) & 0x03);
+        if(iWriteCount >= 2)
+            lpszOutputString[j+1] = ((buf[1] << 4) & 0xf0) | ((buf[2] >> 2) & 0x0f);
+        if(iWriteCount == 3)
+            lpszOutputString[j+2] = ((buf[2] << 6) & 0xc0) | (buf[3] & 0x3f);
+        j+=iWriteCount;
+    }
+    iLen = j;
+    lpszOutputString[j] = '\0';
+
+    return lpszOutputString;
+}
+
+void base64::Decode(istream& istr, ostream& ostr)
+{
+    int i,iWriteCount;
+    char c;
+    char buf[4];
+    char out[3];
+
+    while(1)
+    {
+        iWriteCount = 3;
+        for(i = 0; i < 4; i++)
+        {
+            istr >> c;
+            if(istr.eof())
+            {
+                ostr.flush();
+                return;
+            }
+            if(c == szB64[64])  // Pad
+                iWriteCount--;
+            else {
+                buf[i] = FindIndexInB64(c);
+                //if(buf[i] == -1) error!;
+            }
+        }
+        out[0] = ((buf[0] << 2) & 0xfc) | ((buf[1] >> 4) & 0x03);
+        out[1] = ((buf[1] << 4) & 0xf0) | ((buf[2] >> 2) & 0x0f);
+        out[2] = ((buf[2] << 6) & 0xc0) | (buf[3] & 0x3f);
+        ostr.write(out, iWriteCount);
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/base64.h	Wed Nov 20 08:06:46 2019 +0000
@@ -0,0 +1,45 @@
+#if !defined BASE64_H_INC_
+#define BASE64_H_INC_
+
+#include <string.h>
+#include <iostream>
+#include <fstream>
+
+using namespace std;
+
+// Base64 Encodeing
+class base64
+{
+    int iLen;
+    char *lpszOutputString; // 結果出力先
+    static const char *szB64; // Base64変換テーブル
+
+    static int FindIndexInB64(char c);//szB64の Base64変換テーブルのなかの、どれか、探し出す。ない場合、-1
+public:
+    base64();
+    ~base64();
+    const char *Encode(const char *szStr, int iLens = -1);  // エンコード(文字列用)。ただし、データの長さを指定すれば、バイナリデータが可能
+    const char *Decode(const char *szStr);  // デコード(文字列用)
+    int GetLenght() const { return iLen; }  // 出力された長さ
+    const char *Get() const { return lpszOutputString; }    // 文字列用の結果を取得
+
+    static void Encode(istream& istr, ostream& ostr, int iRet = 76);    // istrはバイナリストリーム推奨
+        // エンコード(ストリーム用) iRetは、何文字目で改行するか。-1なら、改行しない。
+    static void Decode(istream& istr, ostream& ostr);   // ostrはバイナリストリーム推奨
+        // デコード(ストリーム用)
+
+    static void Encode(const char *lpszImputFileName, const char *lpszOutputFileName, int iRet = 76)
+    {
+        ifstream f(lpszImputFileName,ios::in | ios::binary);
+        ofstream of(lpszOutputFileName);
+        Encode(f,of);
+    }
+    static void Decode(const char *lpszImputFileName, const char *lpszOutputFileName)
+    {
+        ifstream f(lpszImputFileName);
+        ofstream of(lpszOutputFileName,ios::out | ios::trunc | ios::binary);
+        Decode(f,of);
+    }
+};
+
+#endif // #if !defined BASE64_H_INC_
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/getGPS.cpp	Wed Nov 20 08:06:46 2019 +0000
@@ -0,0 +1,58 @@
+#include "mbed.h"
+#include "getGPS.h"
+ 
+GPS::GPS(PinName gpstx,PinName gpsrx): _gps(gpstx,gpsrx)
+{
+    latitude = 0;
+    longitude = 0;
+    _gps.baud(GPSBAUD);
+    _gps.printf("$PMTK314,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0*29");
+}
+ 
+bool GPS::getgps()
+{
+    char gps_data[256];
+    int i;
+    
+    do {
+        while(_gps.getc() != '$'); //$マークまで読み飛ばし
+        i = 0;
+ 
+        /* gpa_data初期化 */
+        for(int j = 0; j < 256; j++)
+            gps_data[j] = '\0';
+ 
+        /* NMEAから一行読み込み */
+        while((gps_data[i] = _gps.getc()) != '\r') {
+            i++;
+            if(i == 256) {
+                i = 255;
+                break;
+            }
+        }
+    } while(strstr(gps_data, "GPGGA") == NULL); //GGAセンテンスまで一行ずつ読み込み続ける
+    
+    int rlock;
+    char ns,ew;
+    double w_time, raw_longitude, raw_latitude;
+    int satnum;
+    double hdop;
+ 
+    if(sscanf(gps_data, "GPGGA, %lf, %lf, %c, %lf, %c, %d, %d, %lf", &w_time, &raw_latitude, &ns, &raw_longitude, &ew, &rlock, &satnum, &hdop) > 1) {
+        /* 座標1(度部分) */
+        double latitude_dd = (double)(raw_latitude / 100);
+        double longitude_dd = (double)(raw_longitude / 100);
+ 
+        /* 座標2(分部分 → 度) */
+        double latitude_md = (raw_latitude - latitude_dd * 100) / 60;
+        double longitude_md = (raw_longitude - longitude_dd * 100) / 60;
+ 
+        /* 座標1 + 2 */
+        latitude = latitude_dd + latitude_md;
+        longitude = longitude_dd + longitude_md;
+ 
+        return true;
+    } else
+        return false; //GGAセンテンスの情報が欠けている時
+}
+ 
\ No newline at end of file
--- a/main.cpp	Fri Nov 08 19:48:16 2019 +0000
+++ b/main.cpp	Wed Nov 20 08:06:46 2019 +0000
@@ -1,28 +1,23 @@
 #define cansatB
+#define min(x, y) ((x) < (y)) ? (x) : (y)
 #include "mbed.h"       //mbed
 #include "getGPS.h"         //GPS
 #include "math.h"         //GPS
 #include "TB6612.h"      //motorDriver
-#include "XBee.h"        //XBee
-#include <SoftwareSerial.h>   //カメラ
-#include <SD.h>//SDカード
-#include <JPEGCamera.h>//カメラ
+#include "JPEGCamera.h"//カメラ
+#include "base64.h"//写真ーXBee
 #include "us015.h"  // 超音波センサ
 #include <stdio.h>
 US015 hs(p12,p11);                  //P12 :超音波センサ トリガ出力  //p11 :超音波センサ  エコー入力
-Serial pc(USBTX,USBRX);            //GPs
 GPS gps (p28,p27);                 //GPS
-PwmOut motorSpeedR(p26);  //モーター
-PwmOut motorSpeedL(p25);  //モーター
-DigitalIn flight(p22,p23);      //フライトピン
+
 DigitalOut FET(p21);                //FET
-XBee xbee(p13, p14);               // XBee
+DigitalOut Ultra(p12);
 DigitalIn thermo(p20);     //焦電センサ↓
 DigitalOut led(LED1);     
-Serial pc(USBTX, USBRX); // tx, rx  焦電センサ↑
-Serial pc (p9);     //カメラ
-TB6612 left(p25,p17,p16);
-TB6612 right(p26,p19,p18);
+Serial pc(USBTX,USBRX); // tx, rx  焦電センサ↑
+TB6612 left(p25,p17,p16);//motor
+TB6612 right(p26,p19,p18);//motor
 
 int main() {            //FET
     FET = 0;
@@ -52,7 +47,6 @@
     }
     }
     }
-
 int main() {       //以下GPS
      double a;
      double b;
@@ -104,7 +98,13 @@
 
          if (distance<5){
              printf("%lf\r\n",distance);   
+        left = 100; //左モーター100%
+        right = 100;//右モーター100%
+        printf("直進\n\r");
              }else{
+             left = 0; 
+             right = 0;
+             printf("停止\n\r");
              pc.printf("5m clear!");
              break;
               }
@@ -117,64 +117,215 @@
         return 0;          //注意!void()に変えること.このままだとここで終わる
      }
       
-int main() {
+    int main(){
+  float th;
+  Timer tm;
+  pc.printf("start\r\n");
+
+  bool detected=false;
+    thermo=0; //焦電off
+    Ultra=1;//超音波on
+   
     while(1) {
-        left = 100; //左モーター100%
-        right = 100;//右モーター100%
-        wait(1.0);
-        left = 30;//左30%
-        right = 30;//右30%
-        wait(1.0);
-        printf("OK");
+         hs.TrigerOut();
+         wait(1);
+         int distance;
+         distance = hs.GetDistance();
+         printf("%d\r\n",distance);//距離出力
+        
+        if(distance<2000){//超音波反応
+         Ultra=0;//超音波off
+         thermo=1;//焦電on
+         left = 0; //左モーター0%
+        right = 0;//右モーター0%
+        printf("停止\n\r");
+          if(true)
+             th = thermo;
+             if(th=1 && !detected) {//焦電反応ありの場合
+               detected=true;
+             pc.printf("human\r\n");
+             tm.reset();
+             tm.start();
+             thermo=0;
+       const int RESPONSE_TIMEOUT = 500;
+const int DATA_TIMEOUT = 1000;
+
+JPEGCamera::JPEGCamera(PinName tx, PinName rx) : Serial(tx, rx) {
+    printf("AA\r\n");
+    baud(38400);
+    state = READY;
+}
+
+bool JPEGCamera::setPictureSize(JPEGCamera::PictureSize size, bool doReset) {
+    char buf[9] = {0x56, 0x00, 0x31, 0x05, 0x04, 0x01, 0x00, 0x19, (char) size};
+    int ret = sendReceive(buf, sizeof buf, 5);
+
+    if (ret == 5 && buf[0] == 0x76) {
+        if (doReset)
+            reset();
+        return true;
+    } else
+        return false;
+}
+
+bool JPEGCamera::isReady() {
+    return state == READY;
+}
+
+bool JPEGCamera::isProcessing() {
+    return state == PROCESSING;
+}
+
+bool JPEGCamera::takePicture(char *filename) {
+    if (state == READY) {
+        fp = fopen(filename, "wb");
+        if (fp != 0) {
+            if (takePicture()) {
+                imageSize = getImageSize();
+                address = 0;
+                state = PROCESSING;
+            } else {
+                fclose(fp);
+                printf("takePicture(%s) failed", filename);
+                state = ERROR;
+            }
+        } else {
+            printf("fopen() failed");
+            state = ERROR;
+        }
     }
+    return state != ERROR;
+}
+
+bool JPEGCamera::processPicture() {
+    if (state == PROCESSING) {
+        if (address < imageSize) {
+            char data[1024];
+            int size = readData(data, min(sizeof(data), imageSize - address), address);
+            int ret = fwrite(data, size, 1, fp);
+            if (ret > 0)
+                address += size;
+            if (ret == 0 || address >= imageSize) {
+                stopPictures();
+                fclose(fp);
+                wait(0.1); // ????
+                state = ret > 0 ? READY : ERROR;
+            }
+        }
+    }
+
+    return state == PROCESSING || state == READY;
 }
 
-if(distance<2000){
-    motorStopR();
-    motorStopL();
-    stopUS015();
-    startsb612a();
+bool JPEGCamera::reset() {
+    char buf[4] = {0x56, 0x00, 0x26, 0x00};
+    int ret = sendReceive(buf, sizeof buf, 4);
+    if (ret == 4 && buf[0] == 0x76) {
+        wait(4.0);
+        state = READY;
+    } else {
+        state = ERROR;
+    }
+    return state == READY;
+}
+
+bool JPEGCamera::takePicture() {
+    char buf[5] = {0x56, 0x00, 0x36, 0x01, 0x00};
+    int ret = sendReceive(buf, sizeof buf, 5);
+
+    return ret == 5 && buf[0] == 0x76;
+}
+
+bool JPEGCamera::stopPictures() {
+    char buf[5] = {0x56, 0x00, 0x36, 0x01, 0x03};
+    int ret = sendReceive(buf, sizeof buf, 5);
+
+    return ret == 4 && buf[0] == 0x76;
+}
+
+int JPEGCamera::getImageSize() {
+    char buf[9] = {0x56, 0x00, 0x34, 0x01, 0x00};
+    int ret = sendReceive(buf, sizeof buf, 9);
+
+    //The size is in the last 2 characters of the response.
+    return (ret == 9 && buf[0] == 0x76) ? (buf[7] << 8 | buf[8]) : 0;
+}
+
+int JPEGCamera::readData(char *dataBuf, int size, int address) {
+    char buf[16] = {0x56, 0x00, 0x32, 0x0C, 0x00, 0x0A, 0x00, 0x00,
+                    address >> 8, address & 255, 0x00, 0x00, size >> 8, size & 255, 0x00, 0x0A
+                   };
+    int ret = sendReceive(buf, sizeof buf, 5);
+
+    return (ret == 5 && buf[0] == 0x76) ? receive(dataBuf, size, DATA_TIMEOUT) : 0;
+}
+
+int JPEGCamera::sendReceive(char *buf, int sendSize, int receiveSize) {
+    while (readable()) getc();
+
+    for (int i = 0; i < sendSize; i++) putc(buf[i]);
+
+    return receive(buf, receiveSize, RESPONSE_TIMEOUT);
+}
+
+int JPEGCamera::receive(char *buf, int size, int timeout) {
+    timer.start();
+    timer.reset();
+
+    int i = 0;
+    while (i < size && timer.read_ms() < timeout) {
+        if (readable())
+            buf[i++] = getc();
+    }
+
+    return i;
+}
+    LocalFileSystem local("local");
+
+Serial pc(USBTX,USBRX);
+Serial xbee(p13, p14);
+int main(void){
+    FILE *fp;
+    base64 *bs;
+    int c;
+    
+    xbee.printf("charizard!!!\r\n");
+    bs = new base64();
+    bs->Encode("/local/PICT000.jpg","/local/d.txt");
+    
+    
+   if((fp=fopen("/local/d.txt","r"))!=NULL)
+   {
+       while ((c=fgetc(fp))!=EOF){
+           xbee.printf("%c",c);
+       }
+       fclose(fp);
+   }
+   return 0;
+}
+
+            }else{//焦電反応なしの場合
+             detected=false;
+         thermo=0;
+         Ultra=1;
+             }
+           
+}
+  //while(true)
+  }
+  return 0;
+  }
+  
 //超音波センサー反応あり
 //停止
 //超音波センサーOFF
 //焦電センサーON
-  int main()
-{
-  float th;
-  Timer tm;
-  pc.printf("start\r\n");
-  led=0;
-  bool detected=false;
-  while(true)
-  {
-    th = thermo;
-    if(th==1 && !detected) {
-      led = 1;
-      detected=true;
-      pc.printf("human\r\n");
-      tm.reset();
-      tm.start();
-    }
-    if(tm.read_ms()>10000) {
-      printf("Time out!\r\n");
-      led = 0;
-      detected=false;
-    }
-  }
-}
-   if(detected=true){
-       stopsb612a();
-       startCamera();
-       stopCamera();
-       sendSD();
-       sendPC();
        
    //焦電センサー反応あり
    //焦電センサーOFF
    //カメラ起動
    //カメラOFF
-   //データをSDカードに保存
-   //保存データをXBeeによりPCへ送信
+   //XBeeによりPCへ送信
        if(receiveOK()=true){
            printf("Unknown Creature has been descovered!\n");
            }
@@ -185,12 +336,11 @@
        //"NO"受信、ミッション再開
 
     else if(detected=false){
-        stopsb612a();
-        motorForwardL();
-        motorStopL();
-        motorForwardR();
-        motorForwardL();
-        startUS015();
+        thermo=0;
+        left=100;
+        wait(3.0);
+        right=100;
+        Ultra=1;
         }
     } 
     //焦電センサー反応無し
@@ -200,12 +350,11 @@
     //直進
 }
 else if(distance>=2000){
-    motorStopL();
-    motorStopR();
-    motorForwardL();
-    motorStopL();
-    motorForwardR();
-    motorForwardL();
+    left=0;
+    right=0;
+    left=100;
+    wait(3.0);
+    right=100;
 }
 //超音波センサー反応無し
 //停止