【Processing】画像保存の方法
sample5.png(画像の名前)
ほとんど自分用メモです📝
キーボードのどれかを押したらProcessingの画像をスクショできる仕組みを書いておきます。
プログラム
int a = 1; //番号順に画像保存するために変数を定義 void setup(){ size(300, 150); //サイズ設定 colorMode(HSB, 360, 100, 100); noStroke(); //線無し } void draw(){ //背景を暗い青色に設定 background(245, 71, 30); //横に4つ描くまで処理を続ける for(int i = 0; i < 4; i++){ //縦に3つ描くまで処理を続ける for(int j = 0; j < 3; j++){ fill(random(360), 50 * j, random(100)); ellipse(50 + 65 * i, 50 + 35 * j, 30, 30); } } } void keyPressed(){ //エンターキーが押されたら if(keyCode == ENTER){ //「sample 番号 .png」の名前で画像を保存 save("sample" + a + ".png"); //この処理を行うごとにaを1増やす a++; } }
setup関数の中身ちょこっと解説
カラーモードはHSBで、これは色相(H)、彩度(S)、明度(B)を順に表しています。
設定は色相が360°、彩度が100%、明度も100%になっています。
色相はどんな色にするか(例えば、赤、黄色などのざっくりとした色合いと思って大丈夫です)決めるところ、彩度はその色の鮮やかさ、明度はその色の明るさを表しています。
draw関数の中身ちょこっと解説
for文を使って、繰り返しの処理を行っています。
一番めのfor文ではellipse()で描く円を横に4つ並べるための、
二番めのfor文では横に描いた円それぞれの下に、つまり縦に続くように3つ並べるための準備をしているような感じです。
fillの中身の、色相と明度はランダムに決めるように設定しています。
random(360)のように書くと、0~360の中からランダムで色が決定されます。
ちなみに、random(100, 200)という風に書くと、100~200までの中から値が決まります。
また、真ん中の彩度に関しては、グラデーションのように徐々に色が変化してほしかったので、繰り返し処理文のなかで使った変数「j」を初期設定の彩度の「50」にかけることで、近い値同士で色が変化するようにしました。
またellipse()の解説ですが、この関数は
ellipse(Xの位置(横), Yの位置(縦), 幅, 高さ);
というルールでできています。
位置の所に書いてある「50」は初期位置(基準位置)の設定、「+65」などはほかの円とどれくらいの距離をとるかの設定です。
「*i」などの意味は、iをかけることで横に縦に配置するようにの命令です。
keyPressed関数
この関数は、何かキーが押された時に実行されます。
さらにif()関数の中で、エンターキーが押された時ににだけ実行される文を作ります。
save()関数は、ここに記した名前で画像保存するように処理します。
「+」というのが間に挟まっていますがこれは、前と後ろの文字をつなげるという意味で、実際には名前に入りません。
最後に「a++」することで、次の処理の際に、「a」はひとつ加算されたものとして処理されます。
実際のようす
↑「sample1.png」の名前で保存したもの。
↑「sample2.png」の名前で保存したもの。
書き忘れていましたが、このプログラムはチカチカと円の色が変わり続けるプログラムです。
これは、draw()関数は何度も何度も実行されるために、random()の中の値が何度も何度も切り替わるからです。
なので、スクリーンショットしたその時々で、違う絵を取得することができます。
感想
メモの割にはいろいろ書きすぎたかもしれません。(このブログについての反省点)
Processingは楽しい!
☆☆☆補足☆☆☆
save()関数についての補足です!
何も保存場所を指定しない場合、保存されるのはここ↓になるようです!
プログラムと一緒のフォルダに、保存されるようです。
【Arduino】スイッチで音鳴らしてみた
スイッチ押して音鳴らす!
タクトスイッチのボタンを押すと、音が鳴るしくみです。
プログラム
//タクトスイッチをデジタル2番ピンにつなぐ const int switchPin = 2; //スピーカーピンをデジタル12番ピンにつなぐ const int speakerPin = 12; void setup() { //タクトスイッチは入力用に pinMode(switchPin,INPUT); //スピーカーは出力用に設定 pinMode(speakerPin,OUTPUT); } void loop() { //スイッチを押した時音が鳴るようにする while(digitalRead(switchPin) == LOW){ } tone(speakerPin,262,500);//ド delay(500); tone(speakerPin,294,500);//レ delay(500); tone(speakerPin,330,500);//ミ delay(500); }
これが、最終的なスケッチの形です。
基本は変わらず、タクトスイッチのつながるピンをデジタル2番ピンに、スピーカーのつながるピンはデジタル12番ピンにという設定を最初に描きます。
setup()関数では、タクトスイッチのピンは入力用になるように、スピーカーのピンは出力用になるように設定します。
で、loop()関数の中が一番のポイントでした。
while文を使い、スイッチが通電状態のときにスピーカーを鳴らす処理をするようになっています。
☆ここでちょっとwhile文について☆
そもそもwhile文というのは
while(条件){
文
}
という形の関数で、最初の()の「条件」に合わなくなるまで{}内の「文」の処理がなされ続けるという仕組みになっています。
今回のスケッチでは
while(digitalRead(switchPin) == LOW){ } tone(speakerPin,262,500);//ド delay(500); tone(speakerPin,294,500);//レ delay(500); tone(speakerPin,330,500);//ミ delay(500);}
と描かれているので、
スイッチが絶縁している、つまり押されていない「LOW」の状態に当てはまっていると、{}内には何も描かれていないので何も処理が起こりません。
しかし、ここでスイッチが押されて通電になると「HIGH」の状態になり、while文の条件に合わないためここの処理は飛ばされ、その後にあるtone()関数の処理が行われるようになっています。
こんな説明でおそらくあっているはず…。
回路図
タクトスイッチは、電源の5Vピンと入力用のデジタル2番ピンとブレッドボードのGNDへつなぎます。
あ、タクトスイッチには抵抗をはさんでおきます。
抵抗が無いと、回路がうまく組まれないんです…。
スピーカーは、出力用のデジタル12番ピン、ブレッドボードのGNDにつなぎます。
そしてブレッドボードからは、ArduinoのGNDピンへつなぎます。
感想
前々回くらいの記事で、スイッチを押してスピーカーが鳴るようにしたいというようなことを書いていた気がするのですが、今回それができてよかったなって思います。
思ったよりこれが出来上がったとき楽しく感じました。
【Arduino】ボリューム使ってみた
ボリュームでLEDをコントロール
ボリュームをひねってLEDを点けたり消したりする処理をやってみました。
本当はちょうど手元にボリュームがあったので、せっかく前回スピーカーで音を出すことに成功したし、音量調整できたら面白いんじゃないかと思ってやりはじめたものです。
しかしボリュームの調整の幅が思ったより狭く、というか、もはやタクトスイッチの機能と同じだったため、ボリュームでもLEDを操作できるのではと考えて今回のネタになりました。
ボリュームはこんな感じ
左が横から見た図 右が上から見た図
脚が3つもあるんですね。
タクトスイッチと機能が一緒だと上で書きましたがそれは、シリアルモニタ上で確認すると、ボリュームをひねって表示される数字が0と1のふたつしかなく、これによって反映されるLEDなどの変化の仕方が2種類しかなかったためです。
プログラム
//ボリュームを接続するピン const int volPin = A0; //LEDを接続するピン const int ledPin = 13; void setup() { //アナログ0番ピンを入力用として設定 pinMode(volPin, INPUT); //デジタル13番ピンを出力用として設定 pinMode(ledPin, OUTPUT); //一応シリアルモニタも用意 Serial.begin(9600); } void loop() { //ボリュームの状態を取得 int volValue = digitalRead(volPin); //ボリュームの状態をLEDに反映 digitalWrite(ledPin, volValue); //シリアルモニタにボリュームの状況を反映 Serial.println(volValue); }
ボリュームはA0ピン、LEDはデジタルの13番ピンへつなぐ設定です。
setup()関数では、ボリュームをつなぐA0ピンは入力、LEDは出力という処理をするよう書きます。
またボリュームをひねったときの数字の変化が見たかったので、シリアルモニタを付け加えておきました。
あとは、loop()関数でボリュームの状態を取得して変数に格納、その変数を使ってLEDへ反映させるための処理も書き記しておきます。
ボリュームの状態をシリアルモニタへ反映させるためのプログラムも忘れずに。
回路図
ボリュームは脚が3つあるのでそれぞれ、電源の5V、A0ピン、ブレッドボードのGNDへジャンパワイヤでつなぎます。
LEDはデジタル13番ピンとブレッドボードのGNDをジャンパワイヤでつないでおきます。
ブレッドボードのGND部分は忘れずにArduinoのGNDピンへつないでおく!
あとブレッドボードのGNDは、ボリュームもLEDも、Arduinoへつなぐのにも、列は同じところを使う!!
あ、そうそう。
この記事の一番上の写真にはLEDの前に抵抗が挟まれていますが、それ無しでもできるので回路図にはつけませんでした。
実際のようす
①まず、ボリュームをひねっていない状態
LEDは点灯していません。
その時のシリアルモニタのようすはこちら↓
数値は0のままです。
②次に、ボリュームをマックスまでひねった状態
LEDはぺかーっと点灯しています。
その時のシリアルモニタのようす↓
数字は0から1になっていました。
③おまけですが、真ん中の状態ならば…
LED、きれいに点灯していますね。
もうこの状態を見たらシリアルモニタのようすなんてどうなっているのかわかりますが一応こちらです↓
はい、見事に1がずらーっと表示されています。
消えているときの信号は0、点いているときの信号は1って風に考えればいいんですかね。
感想
最初のほうにも書きましたが、当初思い描いていた使い方ができなくてつまらん!と思いました。
ですが、タクトスイッチのように扱えることが分かったし、なんだかこれまでやってきたことたくさんつまっている感じがして満足だったりはします( ^ω^ )
【Arduino】音を鳴らしてみた
スピーカーを使う
前回、振動センサとして使用した圧電スピーカーを、今度は音を鳴らすのに使ってみました🎶
プログラム
int spe = 12; void setup() { //tone関数を使います tone(spe,262,500);//ド delay(500); tone(spe,294,500);//レ delay(500); tone(spe,330,500);//ミ delay(100); } void loop() { }
スケッチはザッとこんな感じです。
解説は大きく分けて3つポイントがあります。
①スピーカーはデジタル12番ピンにつなぎました。
②そして今回、新たにtone()関数というものを使うことになりました。
tone()関数は、
tone(ピンの番号, 周波数, 音の長さ)
となっています。
周波数というのは音の高さのことで、つまり音階を意味します。
音階は次のようになっています。
この数字をtone()関数の中に打ち込めばその通りの音が鳴ります。
実は、これ以上にもっと音を幅広く出すことがき、それがArduinoのホームページに記載されていたりします。
③tone()関数での命令は、全てsetup()関数の中で終わらせ、loop()関数の中は空にしてあります。
ここでloop()関数の中にいまsetup()関数に描かれていることを描くと、音がずっと鳴り続けます。
setup()関数の中だけにしておくと、音は一回だけ鳴って終わります。
回路図
今回は、ブレッドボードをはさまずに直でArduinoとスピーカーをつなげました。
スピーカーの線の一方をデジタル12番ピンへ、もう一方をGNDピンへつなぎました。
実際のようす
今回は写真等ありません…。
動画を上げれたらいいのですができないので…。
ただ、ちゃんと音は「ドーレーミー」と鳴ったので大成功です!!
感想
音が鳴るとすごく面白く感じますね!
今回は回路もごちゃごちゃ組む必要がなかったので、ものすごく簡単に楽しくArduinoを触ることができました。
次は、スイッチを押したら音が鳴るっていう処理をするのが目標です😃
【Arduino】振動を測ってみた
振動を読み取るセンサ
今回は、振動センサーを使ってシリアルモニタでの数字の変化の様子を見ていきたいと思います!
*振動センサの紹介
これが振動センサ。またの名を圧電スピーカー。
このセンサは、設置場所の振動を検知するものです。
中に圧電素子というのがあるらしく、振動を与えると電圧が発生して振動を検知するようにできています。
また、スピーカーという名前の通り音を出すこともできます。
その場合は逆に、中の圧電素子に電圧をかけて振動を発生させる必要があります。
プログラム
//振動センサを接続するピン //A0ピンに接続します const int sPin = A0; void setup() { //9600bpmでシリアル通信 Serial.begin(9600); } void loop() { //振動センサの値を取得 int sValue = analogRead(sPin); //シリアルモニタに振動センサからの値を表示 Serial.println(sValue); delay(750); }
今までやってきたものばかりです。
A0ピンで読み取った振動センサの値を、シリアルモニタへ表示させるプログラムになっています。
今回はdelay()関数で750ミリ秒待たせることにしました。
これぐらいの速度じゃないと振動センサからの値をシリアルモニタで確認しづらい…。
回路図
振動センサの線って、片方が黒、もう一方が赤で塗られているのにプラスとマイナスは関係ないみたいです。
なのでまぁ適当に、片方はA0ピン、もう片方はGNDピンへつながるようにブレッドボードとジャンパワイヤを使って組みました。
実際のようす
まず、何もしていない普通の状態から。
数字の変化は小さいです。
↓ここからはいろんな振動を与えてみました↓
1.弱く落とし続けてみる。
軽~くポンポンポンと振動センサを落とし続けてみただけです。
数字の変化は、何もしていないときに比べれば幅がありますが、小さいです。
2.強く落としてみる。
ほとんど叩きつけるように強い衝撃を与えてみました。
数字の変化の幅がとても広いです。
500代から一気に200代へ…。
3.叩いてみる。
指で、デコピンするみたいにコンコンコンとたたき続けてみました。
ちょっと強めに叩いていたからか、数字の変化は大きめです。
かなりまばらにいろいろと動いています。
感想
なんというか…。
これであっているのかよくわかりませんが、シリアルモニタ上の数字は変化しているので良しとしましょう😓
というか、私はこういう事よりも早く、スピーカーというのだから音を出してみたい思いのほうが強いです!
次回以降にはスピーカーで音を出す記事を書きます!
【Arduino】光センサ使ってみた
光センサでLEDを操る!
前回の傾斜センサと回路もプログラムも同じような感じです。
傾斜センサが光センサに変わっただけみたいな🤔
光センサはというとこんなやつです。
Amazonでめっちゃ安くて量が多いやつ買いました。
光センサは別名cdsセルと言うそうです。cdsというのは硫化カドミウムのことです。
このセンサーは、明るいときと暗いときで抵抗値が変わる仕組みになっています。
プログラム
//光センサを接続するピンを設定 //光センサはA0ピンに接続 //先頭にconstをつけるとこの後値を変更できなくなります const int sPin = A0; //LEDを接続するピンを設定 const int lPin = 13; //光センサの闘値(HIGHかLOWかを判断する基準値) //ここでの閾値は試行錯誤の結果で設定 const int threshold = 665; void setup() { //デジタル13番ピンを出力用として設定 pinMode(lPin, OUTPUT); //通信速度9600bpsでシリアル通信のポートを開ける Serial.begin(9600); } void loop() { //光センサから得た値をsValueへ格納 int sValue = analogRead(sPin); //シリアルモニタに光センサからの値を表示 Serial.print("sensor = "); Serial.println(sValue); //周りが暗いとき if (sValue < threshold){ //LEDを点灯する digitalWrite(lPin, HIGH); } //それ以外の時(周りが明るいとき) else { //LEDを消灯する digitalWrite(lPin, LOW); } delay(250); }
そいじゃあ解説。
まず、今回私は電源ピンの電圧は3.3Vで光センサに繋げたので、閾値の設定方法は傾斜センサのときとは異なっています。
なんでこうしたかというと、こちらのほうが数値の変化が分かりやすかったからです。
今回なぜか光センサから出力される値の変化がほぼ無く、閾値は光センサとシリアルモニタの様子を見ながら決めた変化が起こりそうなギリギリの値なのです。
で、次。loop()関数の中で光センサから得た値を格納する変数「sValue」を定義し、さらにシリアルモニタに表示させるようにと書いておきます。
またif()関数を使い、先ほどの変数が閾値より小さくなればLEDが点いて、大きくなればLEDは消える状態になるようにともしておきます。
最後に、delay()関数で250ミリ秒待つようにしておきます。
ちなみにこれを書いておくことで、シリアルモニタで値が表示される速度が変わります。
回路図
だいたい今までのものと変わりはありませんが、今回は抵抗はさみませんでした。
光センサは山ほどあるし、LEDも他にあるし一個くらい壊れてもいいかなって思ったので。
色んなセンサーを試したいだけなのでね。
実際のようす
・まず、何もしてない状態。
どうやらこの状態だと、光センサから得た値は閾値より大きいっぽいですね。
シリアルモニタもこの通り。値は666~668の間をうろうろしています。閾値は665なのでギリ超えている感じです。
・次、指でセンサを押さえて暗くしている状態。
はい…。
なぜか点いたり消えたりしています(゜゜)
シリアルモニタもこんな感じ。閾値と同じか小さくなっている値もあるのですが、大きくなっている値も存在しています!なんででしょう…?
ちなみに山ほどあるセンサ全部試しましたが結果は全部一緒でした。
これは何が悪いんだろう…。前の傾斜センサの時も値がうろちょろしてLEDは点いたり消えたりしてたし…。
感想
前回の傾斜センサのときからといい、難しい問題が次々と起きていて焦ります…!
回路の組み方が悪いのか、プログラムが悪いのか、センサーが悪いのか、もしかしたらArduino自身が悪いのか…?
一番ありえそうなのは回路の組み方だと思うんですよね…。だから一度、シールドっていうのを試してみたいです。
ただ前回の結果に対しての個人の勝手な意見は、傾斜センサがいろんな値を出していたのは中にあるボールが転がり続けてたんじゃないかなぁと。
または細かくXYZ軸を指定しないとだめなのかなぁと。
今回のは、センサーを別の品に変えてみようかなって思いました。安価だったのが少し心配ではあったので。
今も別のセンサーをいろいろ試していて、異常なく動いているのでArduino自身に問題があるとは思えませんでした。
まぁ結局、微妙ではあったけどセンサーの値は変化してLEDにちゃんとその結果が反映されて点灯消灯してくれたから良しとします!
【Arduino】傾斜センサとシリアルモニタ
角度を測ってLEDを点灯消灯
新たに傾斜センサという、角度を測るセンサを使ってLEDを制御します。
今回使ったのは、センサの中にあるボールが転って角度を測るタイプのものです。
また、シリアルモニタというのも今回初めて使いました!
スケッチウィンドウの右上にあるコレのことです。
プログラム
//アナログピン5番を利用 int apin = 5; //ledにはデジタル8番ピン利用 int ledpin = 8; //閾値を決める int threshold = 500; void setup() { //デジタル8番ピンを出力設定 pinMode(ledpin,OUTPUT); //シリアル通信設定 Serial.begin(9600); } void loop() { //変数tilt_readを定義 int tilt_read; while(1) { //アナログピンから電圧を読み取って変数に格納 tilt_read = analogRead(apin); Serial.println(tilt_read); //傾斜センサで読み取った値が閾値より小さいとき if(tilt_read < threshold) { digitalWrite(ledpin,HIGH);//led点灯 } //それ以外のとき else { digitalWrite(ledpin,LOW);//led消灯 } //60ミリ秒待つ delay(60); } }
最初のほうに記してある閾値とは、どれくらいセンサが傾けばLEDが反応するかを決める基準値になります。
loop()関数の中では、この閾値よりセンサの値が小さければLEDが点き、それ以外の時は消えるようにと書きました。
閾値は自分で決めるもので、このプログラムでは水平状態だと1023という値が最大値だったので、それの半分くらいで設定してあります。
ここでふたつのことを浅〜く解説
1.シリアルモニタについて
setup()関数の中で、Serial.bigin()関数を使ってパソコンとシリアル通信のポートを開けます。
それから、これの()内には通信速度となる転送レートを書きます。今回は9600bpsに設定してあります。
あと、loop()関数の中にはSerial.println()関数を書いておきます。
この関数の()内のモノの数値が、シリアルモニタへ表示されるようになっているからです。
今回のプログラムでは、tilt_readという変数を定義して、そこに傾斜センサから読み取った値を格納して、シリアルモニタへ表示させています。
☆ちなみに☆
Serial.print()関数をつかうと、()内に記した文字列がシリアルモニタへ表示されるようになっています。
こんなふうに。
ここで忘れてはいけないのが、””(ダブルコーテーション)です。("文字列")って書かないといけません。
2.Arduinoのアナログ値について
Arduinoの電源ピン側には、3.3V、5V、GND、Vinピンがあります。
この赤い四角で囲まれた場所です。
それぞれには3.3V、5V、0Vの電圧が設定されています。
Vinピンは通常は5Vの電圧ですが、外部からの給電があった場合にはそちらの電圧値が出力されます。
で、Arduinoのアナログ値というのは、この0V〜5Vの電圧が0〜1023の値に変換されたものです。
今回の回路では電源は最大値の5Vでつなげてあるので、アナログ値も最大値である1023が出力されるようになっています。
このアナログ値が、シリアルモニタ上に表示されるものになります。
回路図
傾斜センサは、アナログ5番ピンと5Vピンにつなぐ。
LEDは一応抵抗を挟んで、デジタル8番ピンとGNDピンにつなぐ。
って感じです😃
実際のようす
まず、傾けていない状態。
LEDは点いていませんね。
このときのシリアルモニタのようすはこちら。
ずっと1023のままです。
あとそういえば、転送レート9600bpsに設定したなら、シリアルモニタのほうも9600に合わせないと文字化けします。
ウィンドウの右下に合わせるとこあります。
次に、傾けた状態。
LEDは点いています!500という閾値を下回ったようです!
けどめちゃくちゃ点滅してますが…。
その証拠のシリアルモニタのようすはこちら。
数値がさまざまに目まぐるしく変わっています。
なんで数値小さくなったり大きくなったりするんだろう…。そこだけちょっとわかりません(-_-;)
感想
最初、変な回路の組み方しててUSB読み込まなかったから気を付けようと思いました。
シリアルモニタに関しては、仕組みが大体理解できて、これから別のセンサでもばんばん使ってけるなって感じがして楽しみです。
傾斜センサには、調べたところXYZ軸を使ってスケッチ描く方法もあるみたいなのでそれもできたら試したいな…。