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

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

新規登録して質問してみよう
ただいま回答率
85.50%
Node.js

Node.jsとはGoogleのV8 JavaScriptエンジンを使用しているサーバーサイドのイベント駆動型プログラムです。

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

Arduino

Arduinoは、AVRマイコン、単純なI/O(入出力)ポートを備えた基板、C言語を元としたArduinoのプログラム言語と、それを実装した統合開発環境から構成されたシステムです。

Q&A

解決済

2回答

720閲覧

特定の単語を含むツイートを検出してArduinoに指示を送りたい

kusakan

総合スコア10

Node.js

Node.jsとはGoogleのV8 JavaScriptエンジンを使用しているサーバーサイドのイベント駆動型プログラムです。

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

Arduino

Arduinoは、AVRマイコン、単純なI/O(入出力)ポートを備えた基板、C言語を元としたArduinoのプログラム言語と、それを実装した統合開発環境から構成されたシステムです。

0グッド

0クリップ

投稿2019/07/24 03:59

編集2019/07/24 04:03

現在、特定の単語を含むツイートがされればpという指示をArduinoに送り、Arduinoでモータを0.2秒だけ回転させるプログラムを作りたいと思っています。

https://dotstud.io/blog/arduino-nodejs-twitter-connect/

↑こちらの記事を参考にし、#tonpy moveがつぶやかれればpの信号をArduinoに送りモータを回転させ、#tonpy stopがつぶやかれればqの信号をArduinoに送りモータを止める操作はできるようになりました。

しかし、#tonpy stopのことは一度無視して#tonpy moveという単語を含むつぶやきがあったときその都度pの指示をArduinoに送る方法がわからず、#tonpyを含む別のツイートがされるまで永遠にモータが回ってしまいます。

そこで、特定の単語を含むツイートがされたときその都度Arduinoにpという信号を送るプログラムを書くにはどうすればいいのか教えていただきたいです。

app.js

//----------------------------------------------- // twitterからツイートを取得 //----------------------------------------------- const twitter = require("twitter"); const client = new twitter({ consumer_key: '',//Dev Accountで取得したkeyを書く consumer_secret: '', access_token_key: '', access_token_secret: '', }); let tweetText ='w'; client.stream('statuses/filter', {track:"#tonpy "}, (stream) => { stream.on('data', (tweet) => { tweetText = tweet.text; (~tweetText.indexOf('move')) ? (tweetText = 'p') : (tweetText = 'w'); }); stream.on('error', (error) => { console.error(`Error: ${error.message}`); stream.destroy(); }); }); //----------------------------------------------- // Node.jsからArduinoに送信 //---------------------------------------------- const SerialPort = require('serialport'); const port = new SerialPort('/dev/tty.xxx',{ baudRate: 9600 }); port.on('open', () => { console.log('Serial open.'); setInterval(write, 1000); }); port.on('data', (data) => { console.log(`Data from Arduino: ${data}`); }); const write = () => { console.log(`Input to Arduino: ${tweetText}`); port.write(tweetText, (error) => { if(error) { console.error(`Error: ${error.message}`); } }); }

Arduinoは、pが入力されたときだけモータが0.2秒だけ回転するようにプログラムを書き込み、シリアルモニタを使った単体のテストでは成功しています。

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

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

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

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

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

guest

回答2

0

ベストアンサー

#tonpy moveがつぶやかれればpの信号をArduinoに送りモータを回転させ、
#tonpy stopがつぶやかれればqの信号をArduinoに送りモータを止める操作はできるようになりました。

ふむふむ

let tweetText ='w';
(~tweetText.indexOf('move')) ? (tweetText = 'p') : (tweetText = 'w');

お前は何を言っているんだ(画像略
まぁq = wみたいなものなのでしょうね。実際に必要な文字列はwの方なのでしょう。
間違っているなら適当に読み替えてください。

特定の単語を含むツイートがされたときその都度Arduinoにpという信号を送るプログラムを書くにはどうすればいいのか教えていただきたいです。

既存コードはsetIntervalを使っているのが非常にダメです。
何がダメって?
お前毎秒pwの文字列をArduinoに送信し続けてるやん。

せめて前回何を送ったのかとか、
高度なアルゴリズムを描ききるなら兎も角、
これでは同じことばっかり言ってる壊れかけのRadioやん、德永英明かよ。

ツイートを受け取ったタイミングで送信してください。
つまりstream.on('data', fn);の中身で即送信を実行するべきでしょう。


JavaScript的には定義を先にばばーっと書いてしまった方が良いでしょう。
使う側の都合は後で考えます。

なぜsetIntervalを使う必要があったのかに関してですが、
先にtwitterに接続しているので、Arduinoより先にツイートが送られてくるレアケースで死亡した可能性があります。
万が一に備えるならisConnectedみたいなArduinoに接続出来ましたよ情報をもたせて、
先にツイートを受け取ったら書き込まずに捨てるとかが第一段階としては考えられます。

JavaScript

1// ===== 定義 ===== 2// requireは基本的にソースコードの頭にまとめて記述するべし 3const twitter = require("twitter"); 4const SerialPort = require('serialport'); 5const client = new twitter({ 6 consumer_key: '',//Dev Accountで取得したkeyを書く 7 consumer_secret: '', 8 access_token_key: '', 9 access_token_secret: '', 10}); 11const port = new SerialPort('/dev/tty.xxx', { 12 baudRate: 9600 13}); 14let isConnected = false; 15 16// ===== 関数定義 ===== 17const write = tweetText => { 18 if (!isConnected) return; 19 console.log(`Input to Arduino: ${tweetText}`); 20 port.write(tweetText, error => { 21 if (error) { 22 console.error(`Error: ${error.message}`); 23 } 24 }); 25} 26const toOrder = text => 27 (~text.indexOf('move')) 28 ? (tweetText = 'p') 29 : (tweetText = 'w') 30 31// ===== 実行 ===== 32client.stream('statuses/filter', {track:"#tonpy "}, (stream) => { 33 stream.on('data', (tweet) => { 34 write(toOrder(tweet.text)); 35 }); 36 37 stream.on('error', (error) => { 38 console.error(`Error: ${error.message}`); 39 stream.destroy(); 40 }); 41}); 42 43port.on('open', () => { 44 console.log('Serial open.'); 45 isConnected = true; 46}); 47 48port.on('data', (data) => { 49 console.log(`Data from Arduino: ${data}`); 50});

投稿2019/07/24 04:49

miyabi-sun

総合スコア21158

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

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

kusakan

2019/07/24 05:06

実際に修正してモータを動かしたところ、壊れかけのラジオ状態が解消され特定の語がツイートされたときのみモータが回転するようになりました!!あまりJavaScriptを書いた経験がなく右往左往していたところなので、本当に助かりました。丁寧にご回答頂きありがとうございました!
guest

0

ちょっとはなしがわかりませんが、

#tonpy moveがつぶやかれればpの信号をArduinoに送りモータを回転させ

ってことで、そのキーワードがつぶやかれたときにpを送るのはできていると思うんですが、そこらへんどうなってるんでしょうか。

pとqで動く/止まるができているのなら、Arduino側でqを無視するだけ、と思うんですが。

投稿2019/07/24 04:08

y_waiwai

総合スコア87719

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

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

kusakan

2019/07/24 04:42

書き方がわかりにくく、すみません…! 現在は`#tonpy move`がつぶやかれたとき、`p`をArduinoに送り、モータを0.2秒動かすことには成功しているのですが、その状態で`p`が送られ続けてしまい、`#tonpy`を含むツイートがもう一度されるまで1秒毎にモータが0.2秒回転し続ける状態です。`q`に関してはArduino側でも無視しています。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問