フラベアーのワンマンカンパニー(仮)(倒産済み)

コミュ障(重度)プログラマがどうやって一人で金儲けするか試行錯誤を報告していたブログ。アフィ、ネット副業ブログは死すべし

10$で作れるスマートウォッチDIYを作成する(準備編)

どうも、先日初めてPayPalを使った技術者の屑のFlaxBearです。
しかし、これでebayの支払いとか出来るみたいなのでガンガン使っていきたいですね

今回は、前回の最後に書いたスマートウォッチの材料などを購入したので、まとめていこうと思います。

まず最初に、基盤ですが動画通り、JLCPCBというところに頼みました。料金は2$で送料がめちゃくちゃかかると思ったら初回なのか値引きされていました。大体、注文してから2日後に発送のメールが届きます。基盤の枚数は5枚届く予定です。(住所ちゃんと入力できているか負担ですけど...)

次に、電子部品の調達です。調達は、秋月電子通商のサイトとAmazonで揃えました。(大阪なら、日本橋で集めるのが吉なんですけど、時間と交通費をケチりました。あと、部品調達の若干の無駄が発生したので今度からebayとか使っていきたいですね。)
必要な電子部品は、

  • TP4056 ICチップ(バッテリーチャージの動作に必要と思われる)×1
  • SMDタクトスイッチ×3
  • スライドスイッチ×1
  • microUSBジャックコネクタ×1
  • 10uFコンデンサ×2
  • 10kΩ抵抗×8
  • 3.3Vレギュレータ×1
  • ESP12-E(ESP8266)(Wi-Fi通信のため)×1
  • OLED DISPLAY×1
  • 3.7Vバッテリー×1

簡単に取り揃えれるかと思ったのですが、TP4056とESP-12の取り揃えがラズパイやArduino用にモジュール化されているものばかりで最終的にはモジュールから取り出そうということになりました。
そして購入したものがこちら

合計金額は

  • 基盤 2$≒210円
  • TP4056 ICチップ×1、microUSBジャックコネクタ×1 78円
  • SMDタクトスイッチ×3 82.2円
  • スライドスイッチ×1 37.9円
  • 10uFコンデンサ×2 30円
  • 10kΩ抵抗×8 160円
  • 3.3Vレギュレータ×1 20円
  • ESP12-E(ESP8266)×1 899円
  • OLED DISPLAY×1 580円
  • 3.7Vバッテリー×1 433円

2530.1円 = 23.07$
かなりかかってますねorz
実費は6000円近くかかってますw
ESP12-EのモジュールがBluetooth付きのを選んでしまっているので900円近くになっていますね。本当に気を付けたいorz
あと、まとめている時に気がついたのですが、抵抗が5つしか購入してませんでしたorz
ちゃんと何が必要だけリストアップするのではなく、個数もリストアップすべきでしたねorz

プログラムの方はそのままを使うのではなくWi-Fiモジュールが付いているので何かさせたいなと思ってます。
材料が揃うのが今週か、来週の頭になると思うの揃い次第作成を行おうと思います。

2019/05/19追記
電子部品取り外しに必要なフラックスとクリームはんだを購入する予定です。

現状報告(2019/05/12)

どうも、最近steamのHacknetを購入して、「これって一種のセキュリティの勉強じゃね?」って思いながらさぼっているFlaxBearです。
学んだことはプロキシサーバーの回避方法ぐらいなんですけどねorz
今回も先週同様に自作プロジェクトの現状報告など色々と書こうかと思います。

まず、自作プロジェクトと勉強の進捗状況ですが、

  • [自作プロジェクト]BookMarkGroup:ブラウザプラグイン部分制作(ログイン処理)
  • [勉強]Flutter:進んでないぞい
  • [勉強]暗号解読辞典に書かれている暗号方式をプログラムにしてみよう:進んでないぞい
  • [勉強]基本情報技術者試験勉強:ゲームで勉強中
  • [勉強]JavaBronze:問題集で勉強中
  • [ネタ]第二秘書の作成(東北ずん子で覚える!アニメキャラクターモデリング):進んでないぞい

となっています。まあ、GW病み上がりだから...

次に、Youtubeの動画を見ながらVRゴーグルの作成を行いました
参考動画

で、出来たのが....

f:id:flaxbear2710:20190512194809j:plain

20190512 写真1

出来は小学生レベルですがorz
ガジェットを作成するスキルも上げていきたいですねorz

で、次にスマートウォッチを作成しようと考えていまして、一から作るのではなくて基盤のデータをネットから落として、基盤の発注をかけ、電子部品を取り付けプログラムは配布されているのを基礎として自分なりのプログラムに書き換えて作ってみようかと考えています。
参考動画

ただ、いきなり難航していまして、最初に電子基板の発注をかけないといけないのですが、この動画で使っている会社が中国の会社で料金は確かに2ドルなんですが日本の発送する際の送料が12ドルなんですよね。合計で14ドルorz他のサイトやスイッチサイエンスなどにも探してみたんですが、データが読み込まない、項目があるのにページが存在しないなどでかなり迷ってます。2000円ほど安いものなんですけどねorz

最後に、Hacknet買ってハッカー気分をみんなでなろう!!
ついでにフレンドも募集中!!

現状報告(2019/05/05)

どうも、steamで閃乱カグラ PEACH BEACH SPLASH(SENRAN KAGURA Peach Beach Splash)で遊びまくっていたFlaxBearです。
GW期間にsteamのサイトを除いてはいけない(戒め)
ちゃんと画像処理技術に関して勉強していたので許してくださいorz
今回も先週同様に自作プロジェクトの現状報告など色々と書こうかと思います。

まず、自作プロジェクトと勉強の進捗状況ですが、

  • [自作プロジェクト]BookMarkGroup:GW中なので休み
  • [勉強]Flutter:進んでないぞい
  • [勉強]暗号解読辞典に書かれている暗号方式をプログラムにしてみよう:ほぼ進んでないぞい
  • [勉強]基本情報技術者試験勉強:ゲームで勉強中
  • [勉強]JavaBronze:問題集で勉強中
  • [ネタ]第二秘書の作成(東北ずん子で覚える!アニメキャラクターモデリング):進んでないぞい

となっています。まあ、GW期間だからねorz

次にGWにやった画像処理技術の勉強についてこの本を使って勉強していました(大学時代、教材として買ったものなんですけどね)

OpenCVによる画像処理入門 改訂第2版 (KS情報科学専門書)
小枝 正直 上田 悦子 中村 恭之
講談社
売り上げランキング: 87,230

で一応成果の画像がこちら

f:id:flaxbear2710:20190505232128p:plain

20190505写真1

ひよこの画像を使って普通の画像と180度回転させた画像を組み合わせて作成しました
(他にも、フィルタ処理や二値画像処理などちゃんとやっていますので手抜きとは言わないでorz)

それでは、最後にsteamで閃乱カグラ PEACH BEACH SPLASH(SENRAN KAGURA Peach Beach Splash)をやっているのでぜひ協力サバイバルやりましょう!!(露骨なフレンド稼ぎ)
買ってない人は今すぐ買おう!!

現状報告(2019/04/28)

どうも、GWの企画が1日で終わってしまって次何するか考えているうちにすっかり現状報告の記事すら書き忘れていたFlaxBearです。
今の所考えているのは、画像処理技術か、音声技術をと考えていますが、中々具体的な企画が思いつかない状況ですorz
今回も先週同様に自作プロジェクトの現状報告など色々と書こうかと思います。

まず、自作プロジェクトと勉強の進捗状況ですが、

  • [自作プロジェクト]BookMarkGroup:開発途中(firefoxのアドオンを作成。コミット機能完成、更新機能一部完成)
  • [勉強]Flutter:進んでないぞい
  • [勉強]暗号解読辞典に書かれている暗号方式をプログラムにしてみよう:進んでないぞい
  • [勉強]基本情報技術者試験勉強:ゲームで勉強中
  • [勉強]JavaBronze:問題集で勉強中
  • [ネタ]第二秘書の作成(東北ずん子で覚える!アニメキャラクターモデリング):素体ベースのモデリング作成中

となっています。めっちゃ進んでないorz
めちゃくちゃたるんでますねorz
引き締める方法があれば教えてほしいぐらいです

来週の報告は、おそらくGW企画がメインになると思います。
報告出来るものが作れればいんですけどね...

GW企画「micro:bitとラズパイとBLEを使ったミニお天気電光板」

f:id:flaxbear2710:20190428001458p:plain

micro:Weather(と命名)ロゴ

どうも、最近アナログゲーム主に、TCGを再びやりたいと思っているFlaxBearです。
でも遊戯王MTGはカードの種類が多い上にポケカは転売厨ならyoutuberのせいで入手しづらいし、どれも手が出しずらいんですよねorz

今回は、GWで行っている企画「micro:bitとラズパイとBLEを使ったミニお天気電光板」の報告を書いていこうと思います。

まず最初に、どういった企画なのかの説明を...
簡単な構想としては(前の記事で見せたスライドですが)

f:id:flaxbear2710:20190421214028p:plain

20190421写真1

機能としては、micro:bitのボタンを押すと、Bluetooth通信でボタンの状態をやり取りしているラズパイが感知して天気APIからJSONデータを取得して解析してそのデータをmicro:bitに絵として表示するというものです。まずは、micro:bit側のプログラムから

scratch

f:id:flaxbear2710:20190428001917p:plain

javascript

   bluetooth.onBluetoothDisconnected(function () { 
        basic.showIcon(IconNames.Sad) 
        basic.pause(500) 
        basic.clearScreen() 
    })
    bluetooth.onBluetoothConnected(function () { 
        basic.showIcon(IconNames.Happy)
        basic.pause(500) 
        basic.clearScreen() 
    }) 
    bluetooth.startLEDService() 
    bluetooth.startButtonService()

すごく簡単でしたorz色々調べていたら、micro:bitBluetoothの規格がEddyStoneやら、コネクタモードとブロードキャストモードがあり、処理が若干違うなどありましたが...

次はサーバー側(ラズパイ)のプログラムです

// Require
const BBCMicrobit = require('bbc-microbit');
const http = require('http');

// Setting OpenWeaterMap API data
const appid = "";
const id = "";
const today_url = "http://api.openweathermap.org/data/2.5/weather?id=" + id + "&units=metric&appid=" + appid;
const tomorrow_url = "http://api.openweathermap.org/data/2.5/forecast?id=" + id +"&units=metric&cnt=2&appid=" + appid;

const send_pattern = {
	// 非表示
	"None": {
		"value": new Buffer('0000000000', 'hex'),
	},
	// 晴れ
	"Clear": {
		// * * *
		//  ***
		// ** **
		//  ***
		// * * *
		"value": new Buffer('150E1B0E15', 'hex'),
	},
	// 曇り
	"Clouds": {
		//   **
		//  *  *
		// *   *
		//  ***
		"value": new Buffer('000609110E', 'hex'),
	},
	// 雨
	"Rain": {
		//   *
		//  * *
		// *****
		//   *
		//   ***
		"value": new Buffer('040A1F0407', 'hex'),
	},
	// 雷雨
	"Thunderstorm": {
		//   *
		//  *
		// *****
		//    *
		//   *
		"value": new Buffer('04081F0204', 'hex'),
	},
	// 雪
	"Snow": {
		//   *
		//  * *
		//   *
		//  * *
		// *****
		"value": new Buffer('040A040A1F', 'hex'),
	},
	// 霧
	"Mist": {
		//   *
		// ***
		//   *
		//  ***
		//  ***
		"value": new Buffer('041C040E0E', 'hex'),
	}
};

function printConsoleOpeing()
{
	console.log("Hello!! Welcome to micro:Wether!!");
	console.log("=================================================");
	console.log("");
	console.log("    *****************************************    ");
	console.log("   *     +    +    +        *************    *   ");
	console.log("  *       +   +   +        *             *    *  ");
	console.log(" *         + *** +        *               *    * ");
	console.log("*           *   *        *******************    *");
	console.log("*     + + + *   * + + +           |             *");
	console.log("*           *   *                 |             *");
	console.log(" *         + *** +                |            * ");
	console.log("  *       +   +   +               |    /      *  ");
	console.log("   *     +    +    +               ----      *   ");
	console.log("    *****************************************    ");
	console.log("");
	console.log("=================================================");
	return;
}
function printConsoleUsage()
{
	console.log("Usage:");
	return;
}

function startMicroWether()
{
	console.log("\t* Connect micro:bit Bluetooth");
	BBCMicrobit.discover(function(microbit) {
		// Connected
		console.log('\t* Success!! Connected microbit: id = %s, address = %s', microbit.id, microbit.address);

		// Disconnected
		microbit.on('disconnect', function() {
			console.log('\t* micro:bit disconnected');
			console.log('\t Good Bye!!');
			process.exit(0);
		});

		// Button A
		microbit.on('buttonAChange', function(value) {
			if(value == 1) {
				getTodayWeather(microbit);
			}
		});

		// Button B
		microbit.on('buttonBChange', function(value) {
			if(value == 1) {
				getTomorrowWeather(microbit);
			}
		});

		microbit.connectAndSetUp(function() {
			microbit.subscribeButtons(function() {});
		});
	});
}

function getTodayWeather(microbit) {
	http.get(today_url, function(res) {
		var body = '';
		res.on('data', function(chunk) {
			body += chunk;
		});
		res.on('data', function() {
			var weather_data = JSON.parse(body);
			var today_weather = weather_data['weather'][0]['main'];
			var send_data = send_pattern[today_weather]["value"];
			microbit.writeLedMatrixState(send_data, function(){});
			setTimeout(function() {
				send_data = send_pattern["None"]["value"];
				microbit.writeLedMatrixState(send_data, function(){});
			}, 30000);
		});
	});
}

function getTomorrowWeather(microbit) {
	http.get(tomorrow_url, function(res) {
		var body = '';
		res.on('data', function(chunk) {
			body += chunk;
		});
		res.on('data', function() {
			var weather_data = JSON.parse(body);
			var tomorrow_weather = weather_data['list'][1]['weather'][0]['main'];
			var send_data = send_pattern[tomorrow_weather]["value"];
			microbit.writeLedMatrixState(send_data, function(){});
			setTimeout(function() {
				send_data = send_pattern["None"]["value"];
				microbit.writeLedMatrixState(send_data, function(){});
			}, 30000);
		});
	});
}

function main()
{
	printConsoleOpeing();
	printConsoleUsage();
	startMicroWether();
}

main();

主にサーバー側がメインになってます。流れとしては、Bluetoothの接続、各ボタンが押された時の処理(Aボタンは今日の天気、Bボタンは明日の天気)、APIからJSONデータ取得などなど

あとは、サーバー側の説明文の表示をなど作成を行えば完成です。
しかし、10日間の内に1日で完成してしまうとはorz
残りの9日間は何しようか

現状報告(2019/04/21)

どうも、約一カ月にわたる転職活動も終わりを迎えたFlaxBearです。
なんとか、転職出来てよかったですorz
今回も先週同様に自作プロジェクトの現状報告など色々と書こうかと思います。

まず、自作プロジェクトと勉強の進捗状況ですが、

  • [自作プロジェクト]BookMarkGroup:開発途中(firefoxのアドオンを作成。フォルダー作成まで作成完了)
  • [勉強]Flutter:進んでないぞい
  • [勉強]暗号解読辞典に書かれている暗号方式をプログラムにしてみよう:柵型幾何学暗号のコーティング中
  • [勉強]基本情報技術者試験勉強:ゲームで勉強中
  • [勉強]JavaBronze:問題集で勉強中
  • [ネタ]第二秘書の作成(東北ずん子で覚える!アニメキャラクターモデリング):進んでないぞい

となっています。今まで以上に進んでないorz
Flutterの勉強は本当に対策を考えた方がいいですね

BookMarkGroupのサーバーがhttps化など色々したんですけどまさか、アドオンでajaxを使うときhttpでしか使えないなんてorz
しかし、かなり勉強なりました。CSP問題も解決しましたし

最後に、GWの10日間で何か作ろうと考えていまして、
その内容がmicro:bitBluetoothを使ったミニ天気電光板を作ろうかと思います
簡単な内容としては、

f:id:flaxbear2710:20190421214028p:plain

20190421写真1

主な目的としてはBluetoothを使った通信の勉強を目的としています。
BOOKTODOのガジェットとスマホの通信で必須となる技術と思っているので何もしないで開発するより、簡単なものでもいいからとりあえず 触れておこうと思った次第です。

若干、簡単な気もしますが簡単なものほど技術を応用出来るというもの、面白可笑しく楽しめればいいかと思ってます。

暗号解読辞典に書かれている暗号をRubyで書いてみよう その2(幾何学暗号)

どうも、試験問題文で日本特有言い回しでブチ切れ寸前のFlaxBearです。

今回も、以前書いた暗号解読辞典に書かれている暗号をプログラムにしてみようと思います。思った以上に難しかったorz

#
# 幾何学暗号を行い、5文字ずつに区切って出力する
# @param [String] plainText 平文
# @return [Array] 幾何学暗号
def basicGeometryCipher(plainText)
	chipherText = "" # 暗号文
	count = 0 # 平文の指定に使用
	blankPlainText = plainText.gsub(" ", "") # 単語間の空白を取り除く
	textSize = blankPlainText.length #	平文の文字数

	# 平文の文字数が奇数の場合足して偶数にする
	if textSize % 2 == 1 then
		textSize += 1
	end

	# マトリクスの入れ子を作成
	#matrixList = Array.new(textSize/2, Array.new(2)) これはエラーにはならないが不具合を起こし、正しい書き方ではない
	matrixList = Array.new(textSize/2).map{Array.new(2,"")}

	# マトリクスに平文の文字を入れていく
	for matrixList_y in 0..1 do
		for matrixList_x in 0..(textSize/2)-1 do
			matrixList[matrixList_x][matrixList_y] = blankPlainText[count]
			count += 1
		end
	end

	# マトリクスの一番上から二文字ずつ取っていき暗号文を作成する
	for matrixList_x in 0..(textSize/2)-1 do
		chipherText += matrixList[matrixList_x].join
	end

	return chipherText.scan(/.{1,#{5}}/)	# 5文字単位で区切る
end


#
# 幾何学暗号を、平文に戻す
# @param [Array] cipherTextList 暗号文
# @return [String] 平文
def basicGeometryDecryption(cipherTextList)
	plainText = "" # 平文
	count = 0 # 平文の指定に使用
	chipherText = cipherTextList.join # 5文字単の配列なのでまとめる
	chipherTextSize = chipherText.length # 暗号文の文字数

	# 平文の文字数が奇数の場合足して偶数にする
	if chipherTextSize % 2 == 1 then
		chipherTextSize += 1
	end

	# マトリクスの入れ子を作成
	matrixList = Array.new(chipherTextSize/2).map{Array.new(2,"")}

	# マトリクスに暗号文の文字を入れていく
	for matrixList_x in 0..(chipherTextSize/2)-1 do
		for matrixList_y in 0..1 do
			matrixList[matrixList_x][matrixList_y] = chipherText[count]
			count += 1
		end
	end

	# マトリクスから文字を取り出していく
	for matrixList_y in 0..1 do
		for matrixList_x in 0..(chipherTextSize/2)-1 do
			plainText += matrixList[matrixList_x][matrixList_y]
		end
	end

	# マトリクスの一番上から二文字ずつ取っていき暗号文を作成する
	for matrixList_x in 0..(textSize/2)-1 do
		chipherText += matrixList[matrixList_x].join
	end


	return plainText
end

プログラムはコメントを読めばわかると思います(解説放り投げ)。しかし、

matrixList = Array.new(textSize/2, Array.new(2))
matrixList = Array.new(textSize/2).map{Array.new(2,"")}

これがかなり難点でしたorz最初は上の方を書いていたんですけど、全ての配列が連動して入っていてずっと頭の中で?マークが出ていたんですけど調べてみたら下を書かないといけないみたいですね。

参考先

最後に、ルート転置型幾何学暗号のプログラムで凄まじく悩んでいますので、若干間が開くかもしれないです