【Edison】setup

https://software.intel.com/en-us/get-started-edison-windows-step1

https://software.intel.com/iot/hardware/edison/downloads

 

・flash初期化

usbケーブルを2本接続

https://software.intel.com/en-us/articles/flash-tool-lite-user-manual

3GIM v.2.0 + AHIRU

DSC04791

構成

3GIM v2.0

AHIRU nestra board.

FTDIケーブル

Arduino 1.6.9

 

接続

3GIM v.2.0   —- AHIRU(ESP8266) –

1(POWER)—-14

2(RX)—-13(TX)

3(TX)—-12(RX) 

4(IOREF)—AHIRUの3v3

5—3v3(電源)   ※ 3.3-4.2Vなので注意

6—GND

 

 

#include <SoftwareSerial.h>

#include <ESP8266WiFi.h>
#include <ESP8266WiFiMulti.h>
#include <WiFiClient.h>
#include <WiFiServer.h>
#include <WiFiUdp.h>

//=== ARDUINO IO ===
#define SS_RX 12
#define SS_TX 13
#define PIN_3G_ON 14

String s_cmd;

SoftwareSerial ss(SS_RX, SS_TX);

void setup() {

  pinMode(PIN_3G_ON, OUTPUT);

  ss.begin(9600);
  Serial.begin(115200);

  delay(100);
  Serial.println("Start");

  digitalWrite(PIN_3G_ON, HIGH);
  Serial.println("3GIM OFF");

  delay(3000);

  digitalWrite(PIN_3G_ON, LOW);
  Serial.println("3GIM ON");

  delay(15000);

}

void loop() {

    if (Serial.available()){

      char c = Serial.read();
      if(c != 0x0A){  // LF
        s_cmd += String(c);
      }
      if(c == 0x0A){  // LF
        Serial.println(s_cmd);
        ss.println(s_cmd.c_str());
        s_cmd = "";
      }
    }
    if (ss.available()){
    Serial.write(ss.read());
   }
}

 

シリアルターミナルから、コマンドを入力する

スクリーンショット 2016-06-01 午後7.05.45

SIMを使えるようにする。

$PS (APN) (user) (password)

OCNモバイルワンSIMを使えるようにする。

$PS 3g-d-2.ocn.ne.jp mobileid@ocn mobile

 

コマンド諸々

$YV gw3gアプリのバージョン情報の取得
$YR 電波受信強度(RSSI)の取得
$YS
$YI IMEIの取得
$YL LED(RUN)の状態の取得、設定
$YB UARTの通信速度取得
$YB 9600 9600bpsに設定
$YB 38400 38400bpsに設定
$YP    機内モード確認
$YP 0 通常モードにする
$YP 1 機内モードにする

 

HTTP GET/POST

$WG http://test.jp/

$WP http://test.jp/api/data/add/ "id=1234&s1=10&s2=20" "Content-Type: application/x-www-form-urlencoded\r\n User-Agent: ESP-WROOM-002\r\n Connection: close\r\n"

 

ESP-WROOM-02 HTTP/POSTする

IMG_20150922_120127

 

昨日作ったボードで一旦 POSTしてみます。

電源はお馴染みのftdi(3.3v)ケーブルでいれます。

#include <ESP8266WiFi.h>
#include <ESP8266WiFiMulti.h>
#include <WiFiClient.h>
#include <WiFiServer.h>
#include <WiFiUdp.h>


void postData(String ip_addr, int port,String sid, float value );

//=== WiFi ===
const char* ssid = "wifi ssid";
const char* password = "wifi password";

//=== SENSOR ===
const String API_KEY = "uuid";
const String SID = "this sensor id";
const char* server= "server ip addr";
const int port = 8000;

void setup() {

  pinMode(16, OUTPUT);

  Serial.begin(115200);
  delay(100);
  
  Serial.println("");
  Serial.println("Start");
  Serial.print("Connecting to ");
  Serial.println(ssid);

  WiFi.begin(ssid, password);
  delay(3000);
}

int cnt=0;

void loop() {

  if (WiFi.status() != WL_CONNECTED) {
  
    delay(3000);
    Serial.print(".");
 
  }else{
    
    Serial.println("");
    Serial.println("WiFi connected");
    
    postData(server, port, SID, cnt);
    cnt++;
    delay(60000);
  }
}

void postData(String ip_addr, int port,String sid, float value ) {

  WiFiClient client;
  
  if (client.connect(ip_addr.c_str(), port) ) {
  
    Serial.println("connected.");
    
    String param = "sid=" + sid + "&value=" + value + "&api_key=" + API_KEY;

    String data = "POST /api/data/add/ HTTP/1.1\r\n";
    data += "Host: " + ip_addr + "\r\n";
    data += "User-Agent: ESP-WROOM-002\r\n";
    data += "Connection: close\r\n";
    data += "Content-Type: application/x-www-form-urlencoded;\r\n";
    data += "Content-Length: " + String(param.length()) + "\r\n";
    data += "\r\n";
    data += param;

    Serial.println(data);

    client.print(data.c_str());
  
  } else {
    Serial.println("Connection failed");
    client.stop();
  }
}

 

ESP-WROOM-02

IMG_20150921_214507

ESP-WROOM-02+マイクロテクニカのブレッドボード基盤です。

まず、接続部分。

FTDIの3.3Vケーブルからの、5Vをレギュレータで、3.3Vに変換してボードに入れてます。

あと、RESETはスイッチにしました。

GPIO 0,2,15があって、このピンの組み合わせでUART書き込みモードか、Flash動作モードに

なるかを変更します。

UART Download Mode

GPIO0  L

GPIO2 H

GPIO15 L

 

Flash Boot Mode

GPIO0  H

GPIO2 H

GPIO15 L

 

http://akizukidenshi.com/download/ds/espressifsystems/0C-ESP8266__WROOM_WiFi_Module_Datasheet__EN_v0.3.pdf

流れとしてはプログラムを変更したらGPIO0をLにして書き込んから、

GPIO0をHをにしてフラッシュブートします。

 

で、ソフトもArduino資産が使えるのがいいです。

環境はArduino 1.6.5でやりました。

BoardManagerから「esp8266」を検索窓にいれて、該当モジュールをinstallします。

スクリーンショット 2015-09-21 午後10.04.46

メニューからボード選択ができるようになり、設定そのままでボードにロードします。

このときはUART書き込みモードにします。

で、書き込み終了したら、Flash Bootモードにして、起動します。

 

ブレッドボードでは、書き込み時にピンを差し替えてH/L切り替えしていたんですが

書き込みSWあったほうがいいなって思って、勢いで作りました。

2mmピッチの部分ってなんとかなんないんかな。

IMG_20150922_002302

 

 

【Arduino】WDT

#include <Watchdog.h>
#include <Sleep.h>

SoftwareSerial ss(2, 3); // RX, TX
int a=0;


WatchdogClass WD = WatchdogClass();

void setup() {

  pinMode(8,INPUT);
  pinMode(9,OUTPUT);
  
  WD.systemResetEnable(false);          
  WD.enable(WatchdogClass::TimeOut8s); 

  Serial.begin(38400);
  Serial.println("Hello, world?");
}
int i=0;
void loop() {

  Serial.write("A");

  digitalWrite(9,HIGH);        // LED点灯開始
  delay(3000);                  // 3秒間
  digitalWrite(9,LOW);         // LED点灯停止

  WatchdogClass::timerReset();  // Watchdogタイマーリセット
  SleepClass::powerDown();      // パワーダウン

}

 

【Arduino】GPS

IMG_20150912_152353

 

GPS: GMS-G9  ランニングエレクトロニクス

1:GND

9:TXD

12:VCC

 

Arduino Pro mini

9: RX(software serial)

#include <avr/sleep.h>
#include <avr/interrupt.h> 
#include <SoftwareSerial.h>
#include <TinyGPS.h>

#define __DEBUG__

TinyGPS gps;
SoftwareSerial ss(9, 8);

void setup()
{
  Serial.begin(38400);
  ss.begin(9600);  // GMS-G9 
  
  Serial.print("Hello!!!");
}

void loop()
{
  bool newData = false;
  unsigned long chars;
  unsigned short sentences, failed;

  // For one second we parse GPS data and report some key values
  for (unsigned long start = millis(); millis() - start < 1000;)
  {
    while (ss.available())
    {
      char c = ss.read();
//      Serial.write(c); // uncomment this line if you want to see the GPS data flowing
      if (gps.encode(c)) // Did a new valid sentence come in?
        newData = true;
    }
  }

  if (newData)
  {
    float flat, flon;
    unsigned long age;
    gps.f_get_position(&flat, &flon, &age);
    
    Serial.print("LAT=");
    Serial.print(flat == TinyGPS::GPS_INVALID_F_ANGLE ? 0.0 : flat, 6);
    Serial.print(" LON=");
    Serial.print(flon == TinyGPS::GPS_INVALID_F_ANGLE ? 0.0 : flon, 6);
    Serial.print(" SAT=");
    Serial.print(gps.satellites() == TinyGPS::GPS_INVALID_SATELLITES ? 0 : gps.satellites());
    Serial.print(" PREC=");
    Serial.print(gps.hdop() == TinyGPS::GPS_INVALID_HDOP ? 0 : gps.hdop());
  }
  
#ifdef __DEBUG__  
  gps.stats(&chars, &sentences, &failed);
  Serial.print(" CHARS=");
  Serial.print(chars);
  Serial.print(" SENTENCES=");
  Serial.print(sentences);
  Serial.print(" CSUM ERR=");
  Serial.println(failed);
#endif  
  if (chars == 0)
    Serial.println("** No characters received from GPS: check wiring **");
}

 

 

【Arduino】雨量計計測(割り込みでカウント)

雨量計を利用するとき、雨が降っている時だけカウントして、あとはスリープしていたい。
雨量計はシーソーが傾き、真ん中になった時にスイッチがONされる。
その地点を越えればまたOFFされるという仕様。

スイッチをpull-upしておき外部割り込みのPIN2に繋ぎその立ち上がり時の
割り込みをハンドルする。
また、スイッチであるためチャタリング除去のプログラムが必要。
省電力のためスリープを優先し今回の実装とします。

#define BOUNCE 200
int pin = 13;
int start_time;

volatile int state = LOW;
WatchdogClass WD = WatchdogClass();

void setup() {
  
  Serial.begin(9600);

  Serial.println("START");
  
  pinMode(pin, OUTPUT);
  attachInterrupt(0, blink, RISING);

  WD.systemResetEnable(false);
  WD.enable(WatchdogClass::TimeOut4s);
}

void loop() {
 digitalWrite(pin, state);

 delay(100);
 WatchdogClass::timerReset();

 //power save mode. arduino can wakeup from timer2 intr. 
 SleepClass::powerSave();
}

int cnt = 0;

void blink() {

  // start count
  if(start_time == 0){
    start_time = millis();
  }else{
    if( (millis() - start_time) > BOUNCE ){

      start_time = 0;
      Serial.println(cnt);
      cnt++;
      state = !state;
    }
  }
}