みなさん,こんにちは
おかしょです.
Processingはよくビジュアルアート作品を作るのに使われます.
このブログではビジュアルアートではなく,電子工作で作成したロボットの状態をかっこよく表示するために使用しています.
今回はパソコンのキーボードで入力した値を数値としてProcessingで処理するために必要なプログラムを解説していきます.
この記事を読むと以下のようなことがわかる・できるようになります.
- Processingのプログラミング
- 浮動少数をProcessingにキーボードで入力する方法
- マイコンに数値を送信する方法
この記事を読む前に
先程から言っているように,この記事ではProcessingというフリーソフトを使用します.
Processingをインストールしていない方は,以下の記事でインストール方法を解説しているので参考にして下さい.
やりたいこと
このブログでは様々なロボットの開発をしています.
ロボットを自律させるためには制御器のパラメータを調整する必要があります.
これをするにはArduinoなどのマイコンにパラメータを試しては調整して書き込みなおさなければなりません.
このようにパラメータ調整のたびにマイコンにプログラムを書きこみなおすのは非常に面倒です.
そこで,プログラムを書きこみなおすことなくパラメータの調整をするためにProcessingを使用してキーボードでパラメータを変更できるようにします.
Processingではキーボードのどのキーを押されているのかを知ることが簡単にできます.
しかし,どのキーを押したのかはわかりますがそれを数値として認識することはできません.
例えば,45と認識させたくてキーボードを打っても,4と5は認識されますが45としては認識することができません.
そこで,この記事ではキーボードを使ってProcessingに数値を認識させる方法を解説します.ここではパラメータの調整のために浮動小数点を認識する方法を解説します.
プログラム
今回の記事ではキーボードを使ったプログラムを紹介します.
公開するプログラムを理解するには,以下の記事で解説しているキーボードの使い方を理解している必要があります.Processingのプログラミングでキーボードの使い方がわからない方は以下の記事を参考にしてください.
まずは浮動小数点を認識できるプログラムを以下に示します.
float num;
int keyP;
int m;
int ch =0;
int count = 0;
void setup()
{
m = millis();
}
void draw()
{
if(keyPressed)
{
if((key!=keyP) || (millis()-m>=100))
{
if(key=='.')
{
ch = 1;
}
if(key==BACKSPACE)
{
if(ch==1)
{
count = count-1;
if(count<=0)
{
num = floor(num*pow(10,count))/(pow(10,count));
ch = 0;
}
else
{
num = floor(num*pow(10,count))/(pow(10,count));
}
}
else
{
num = floor(num/10);
}
}
if(key>=48 && key<=57)
{
num = num*pow(10,count+1)+(key-48);
if(ch==1)
{
count = count+1;
num = num/pow(10,count);
}
}
keyP = key;
m = millis();
}
if(keyCode==ENTER)
{
ch = 2;
}
println(num);
}
}
このプログラムで工夫したのは以下の4点です.
1回打ったら1回認識されるようにする
Back spaceで文字を消せる
小数点の認識
打ち込まれた数字を数値として認識する
プログラムでは順番に打ち込まれた数字を数値として認識させる必要があります.
プログラム中では42行目でキーボードの数字を読み込んでいます.
このif文ではkeyが48から57の時に数値の処理をするようにしています.
Processingのキーコードではテンキーの0は48という数字が割り当てられていて,9は57という数字が割り当てられています.
そのため,数値の処理を行っている44行目では打ち込まれたキーから48を引くことで正しい数字として認識しています.
1回打ったら1回認識されるようにする
Processingでキーボードの打ち込みを認識しようとすると,1回だけ押しても複数回押されたと認識されることがあります.と言うよりも,1回だけ認識されるのはほぼ不可能です.
そこで,1回だけ認識したら同じキーが打ち込まれても認識されないようにします.
そのためにやっている処理が,プログラム中の16行目です.
if文の制御文にある“keyP”には1ループ前に打ち込まれたキーが格納されています.(51行目参照)
if文では現在認識されたキーが“keyP”とは異なる場合に入るようになっています.
これをすると,1度打ち込んだら同じキーはその後の処理に入らないので,1回しか認識されなくなります.
しかし,このままでは11などの連続した数値を認識できなくなってしまいます.
そこで,もう一つの制御文を使用します.
もう一つの制御文“millis()-m>=100”では1ループ前にキーが認識されてからどれだけの時間が経ったのかを求めています.
このプログラムでは100 ms以上が経過すると,1ループ前のキーと同じキーが打ち込まれてもその後の処理を行えるようになります.
Back spaceで文字を消せる
ミスなく文字を打ち込むことが必ずできるという方はおそらくいないと思います.
もしミスをしてしまった場合,取り返しのつかないようなプログラムでは困ってしまいます.
そこで,通常通りBack spaceキーで文字を消せるようにします.
Processingでは“BACKSPACE”として認識することができます.(22行目参照)
消し方は単純です.
消したい数字を小数点以下第1位に移動させて,小数点以下を切り捨てることで数字を一つだけ消します.切り捨てた後は,桁の処理をすれば完了です.
整数の場合は,消したい数字は必ず1の位にあるので10で割って小数点以下を切り捨てるだけで済みます.(39行目参照)
しかし,小数を含む場合は項はいきません.小数を含む数字を10で割ってしまうと,小数第1位からさらに遠ざかってしまうため同じような処理ではできません.
小数を含む場合は現在打ち込んでいる小数が小数点以下第何位なのかを把握し,そのくらいに合わせて何倍かする必要があります.
小数点以下の位の把握は”count”という変数で行っています.
この”count”を使用して消したい数字を小数第1位まで移動させて,消しています.
このときに便利なのが“pow”というコマンドです.これは第1引数の値を第二引数乗してくれるコマンドで,今回のようにくらいの移動をさせるために10の”count”乗を掛けたり割ったりしています.
小数点の認識
制御器のパラメータの調整などには小数点が必要になることが多いです.
そのため,小数点を表現できることは必須になります.
小数点の認識は18行目で行っています.
ここではこれから小数点以下の数字を打ち込むことを知らせるために”ch”という変数を使用しています.”ch”が1になると小数点以下として数字を認識していきます.
小数点としての数値の処理は45~49行目で行っています.
小数点だからと言って特別なことはしていません.
打ち込んだ数字が小数点以下第何位なのかをcountで把握して,10の”count”乗で割るだけです.
実行結果
以上のプログラムを実行すると以下のようにコンソール画面に表示されます.
Processingでキーボードから打ち込んだ数値の認識が行えるプログラムを作りました.Back spaceキーで1文字ずつ消せるようにもしています.小数点を打てば小数の入力もできます. pic.twitter.com/sIy4GMMdXk
— おかしょ (@okasho_engineer) September 13, 2020
※数値を入力するときは実行してすぐに表示されるウィンドウを選択するようにしてください.
普通は自動的にウィンドウが選択された状態で始まるので,すぐに数値を入力しても認識されるのですが,たまに自動で選択されず自分でウィンドウを一度クリックして選択しなければいけないことがあります.
ウィンドウが選択された状態でないと,数値を入力してもコンソールには何も表示されないので気を付けて下さい.
まとめ

この記事ではProcessingにキーボードで入力した数値を認識させる方法について解説しました.
このプログラムを使用すれば,マイコンにプログラムを書きこみなおさなくてもキーボードからパラメータの調整をすることができます.
続けて読む
このブログでは他にもキーボードを使ったProcessingの操作方法を解説しています.
以下の記事ではキーボードを使ってモーターの制御を行っています.
興味のある方は是非参考にしてください.
Twitterでは記事の更新情報や活動の進捗などをつぶやいているので気が向いたらフォローしてください.
それでは最後まで読んでいただきありがとうございました.
コメント