質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

Raspberry Pi

Raspberry Piは、ラズベリーパイ財団が開発した、名刺サイズのLinuxコンピュータです。 学校で基本的なコンピュータ科学の教育を促進することを意図しています。

Q&A

1回答

4175閲覧

GPSの位置情報の取得について

20175505

総合スコア10

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

Raspberry Pi

Raspberry Piは、ラズベリーパイ財団が開発した、名刺サイズのLinuxコンピュータです。 学校で基本的なコンピュータ科学の教育を促進することを意図しています。

0グッド

0クリップ

投稿2018/12/12 08:23

緯度経度の位置情報をシリアルモニタに出力させたい

GPSモジュール(1PPS出力付き「みちびき」)で得た位置情報をESPr Developer(ESP-WROOM-02開発ボード)を通じてラズベリーパイへ送信するプログラムを作っています。

発生している問題・エラーメッセージ

スイッチが押されたら位置情報が取得されるプログラムを作成したいのですが、シリアルモニタで出力を確認したところ、スイッチを押しても何も表示されませんでした。

該当のソースコード

C++

1/* ESP8266+LoRaモジュール+GPSモジュールで、 2 * スイッチを押されたら緯度経度を取得し、 3 * bw, sfを変えながらLoRaで送信し、 4 * LoRaモジュールからのレスポンスをプリントする 5 */ 6#include <ESP8266WiFi.h> 7#include <SoftwareSerial.h> 8#include <TinyGPS++.h> 9#include <string.h> 10 11extern "C" { 12#include "user_interface.h" 13} 14 15static const int LED = 2; 16static const int gps_RX = 4, gps_TX = 5; 17SoftwareSerial gps_ss(gps_RX, gps_TX, false, 256); 18TinyGPSPlus gps; 19 20static const int sw = 16; 21static const unsigned long PUSH_SHORT = 1000; 22 23static const int LoRa_RX = 13, LoRa_TX = 12; 24static const int LoRa_Rst = 14; 25SoftwareSerial LoRa_ss(LoRa_RX, LoRa_TX, false, 256); 26 27void LoRa_reset(void) { 28 digitalWrite(LoRa_Rst, LOW); 29 delay(100); 30 digitalWrite(LoRa_Rst, HIGH); 31} 32 33int LoRa_recv(char *buf) { 34 char *start = buf; 35 36 while (true) { 37 delay(0); 38 while (LoRa_ss.available() > 0) { 39 *buf++ = LoRa_ss.read(); 40 if (*(buf-2) == '\r' && *(buf-1) == '\n') { 41 *buf = '\0'; 42 return (buf - start); 43 } 44 } 45 } 46} 47 48int LoRa_send(char * msg) { 49 char *start = msg; 50 while (*msg != '\0') { 51 LoRa_ss.write(*msg++); 52 } 53 return (msg - start); 54} 55 56#define NMODE 24 57 58struct mode { 59 int bw; 60 int sf; 61 int timeout; 62}; 63struct mode Mode[NMODE] = { 64 {3, 12, 5}, {3, 11, 5}, {3, 10, 4}, {3, 9, 3}, {3, 8, 2}, {3, 7, 2}, 65 {4, 12, 5}, {4, 11, 4}, {4, 10, 3}, {4, 9, 3}, {4, 8, 2}, {4, 7, 2}, 66 {5, 12, 4}, {5, 11, 3}, {5, 10, 2}, {5, 9, 2}, {5, 8, 2}, {5, 7, 2}, 67 {6, 12, 3}, {6, 11, 3}, {6, 10, 2}, {6, 9, 2}, {6, 8, 2}, {6, 7, 2}, 68}; 69 70int sendcmd(char *cmd) { 71 unsigned long t; 72 char buf[64]; 73 74 Serial.print(cmd); 75 LoRa_send(cmd); 76 77 while (true) { 78 LoRa_recv(buf); 79 if (strstr(buf, "OK")) { 80 Serial.print(buf); 81 return true; 82 } else if (strstr(buf, "NG")) { 83 Serial.print(buf); 84 return false; 85 } 86 } 87} 88 89void setMode(int bw, int sf) { 90 char buf[64]; 91 92 LoRa_send("config\r\n"); 93 delay(200); 94 LoRa_reset(); 95 delay(1500); 96 97 while (true) { 98 LoRa_recv(buf); 99 if (strstr(buf, "Mode")) { 100 Serial.print(buf); 101 break; 102 } 103 } 104 105 sendcmd("2\r\n"); 106 sprintf(buf, "bw %d\r\n", bw); 107 sendcmd(buf); 108 sprintf(buf, "sf %d\r\n", sf); 109 sendcmd(buf); 110 sendcmd("q 2\r\n"); 111 sendcmd("w\r\n"); 112 113 LoRa_reset(); 114 Serial.println("LoRa module set to new mode"); 115 delay(1000); 116} 117 118void send2LoRa() { 119 char obuf[64], ibuf[64], shortbuf[32]; 120 char * buf; 121 int n; 122 unsigned long t; 123 124 strcpy(obuf, "loc=("); 125 dtostrf(gps.location.lat(), 12, 8, &obuf[strlen(obuf)]); 126 strcat(obuf, ","); 127 dtostrf(gps.location.lng(), 12, 8, &obuf[strlen(obuf)]); 128 strcat(obuf, ")\r\n"); 129 130 strcpy(shortbuf, "loc=("); 131 dtostrf(gps.location.lat(), 8, 4, &shortbuf[strlen(shortbuf)]); 132 strcat(shortbuf, ","); 133 dtostrf(gps.location.lng(), 8, 4, &shortbuf[strlen(shortbuf)]); 134 strcat(shortbuf, ")\r\n"); 135 136 digitalWrite(LED, HIGH); 137 138 for (int i = 0; i < NMODE; i++) { 139 Serial.print("setMode(bw: "); 140 Serial.print(Mode[i].bw); 141 Serial.print(", sf: "); 142 Serial.print(Mode[i].sf); 143 Serial.println(")"); 144 145 setMode(Mode[i].bw, Mode[i].sf); 146 147 t = millis(); 148 delay(500); 149 150 Serial.print("send to LoRa: "); 151 buf = (i == 0) ? shortbuf : obuf; 152 Serial.print(buf); 153 LoRa_send(buf); 154 155 while (true) { 156 LoRa_recv(ibuf); 157 if (strstr(ibuf, "OK")) { 158 Serial.print(ibuf); 159 break; 160 } else if (strstr(ibuf, "NG")) { 161 Serial.print(ibuf); 162 break; 163 } 164 } 165 166 if (i != 0) { 167 long s; 168 169 s = Mode[i].timeout * 1000 - (millis() - t); 170 if (s > 0) { 171 Serial.print("delay: "); 172 Serial.println(s); 173 delay(s); 174 } 175 } 176 } 177 178 digitalWrite(LED, LOW); 179} 180 181void setup() 182{ 183 WiFi.mode(WIFI_OFF); 184 185 Serial.begin(115200); 186 delay(20); 187 188 pinMode(LED, OUTPUT); 189 digitalWrite(LED, LOW); 190 191 gps_ss.begin(9600); 192 193 pinMode(sw, INPUT); 194 195 LoRa_ss.begin(115200); 196 pinMode(LoRa_Rst, OUTPUT_OPEN_DRAIN); 197 digitalWrite(LoRa_Rst, HIGH); 198 199 LoRa_reset(); 200 201 delay(1000); // LoRaモジュールをリセットしてからCPUと通信できるまでに1秒程度かかるようだ 202 203 while (LoRa_ss.available() > 0) { 204 char c = LoRa_ss.read(); 205 if (c < 0x80) { 206 Serial.print(c); 207 } 208 } 209 Serial.println(F("\r\nStart")); 210} 211 212void loop() 213{ 214 unsigned long gauge = 0; 215 char buf[128]; 216 217 while (digitalRead(sw) == 0) { 218 gauge++; 219 delay(0); 220 } 221 if (gauge > PUSH_SHORT) { 222 if (gps.location.isValid()) { 223 gps_ss.enableRx(false); 224 send2LoRa(); 225 gps_ss.enableRx(true); 226 } 227 } 228 while (gps_ss.available() > 0) { 229 if (gps.encode(gps_ss.read())) { 230 break; 231 } 232 } 233}

試したこと

読み込みに使用するボードは「Generic ESP8266 Module」ですが、別のボードで読み込みを行ってみました。

補足情報(FW/ツールのバージョンなど)

ここにより詳細な情報を記載してください。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

まずはGPSから受信したものをそのままシリアルに出して、きちんと受信してるかチェックしてみては。

投稿2018/12/12 08:35

y_waiwai

総合スコア87774

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

20175505

2018/12/12 08:45

直接ラズベリーパイに送るってことですか?
y_waiwai

2018/12/12 08:52

いや、PCにつないで、Teratermなどのターミナルソフトで見ればいいんでは
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問