【Arduino】Arduino Nano(互換機)と赤外線センサでバイクの死角検知装置を作る
とあるYoutube動画で死角センサーなるものが紹介されていました。
maxwin.jp
どうやらクラファンで数万円するものらしく、これぐらいなら自分で作れんものかな?ということで電子工作。
材料は以下。
・赤外線センサ:GP2Y0A710K(https://akizukidenshi.com/catalog/g/gI-03157/)
・ブレッドボード
・0.2sqの配線
・Arduino Nano(互換機)
・配線コネクタ([https://amzn.to/3oQaIw2)
1.赤外線センサの概要
GP2Y0A710Kは最大550cmまで測距してくれるらしい。
値段は1200円ぐらい(秋月)ですが、2個必要なのでまーまー高い。でも見た感じ秋月で買うのが一番安い。
このセンサはVccの接続を2つ設ける必要があるため(たぶん送信と受信で2つ?)、GNDの2つと信号線で計5つの線をArduinoと接続します。
とりあえず、買ったセンサはコード延長が必要になるため、コネクタを追加します。
両端から出ている黄色と赤の線がGND、青と黒がVcc、白が信号線になります。まぁ説明書に書いてあるのでよく読みましょう。
5足のオスコネクタをセンサ側につけます。
延長コードは0.2sqの配線コードを使って作成し、メスコネクタを付けます。(写真撮り忘れ)
2.ブレボイメージと回線図
ブレボイメージと回路図はこんな感じ。アイコンの関係上、以下画像でセンサから出ているコードは3本ですが、実際は先ほどの記載の通り5本です。
また、実際にはもっと小さいブレボ使ってます。
LEDも似たような感じで延長コードを作成して動作確認。
以前書いたPWM Pinを使えば、プログラムで明るさを制御できる。抵抗を挟まなくていいので非常に楽。
engetu21.hatenablog.com
ESP-WROOM-02を2つ使えばLEDと赤外線センサを分ければ無線(Wifi)経由でAPIでやり取りできるけど、あんまりメリットはないなぁ。
3.プログラム
LEDはPWMが使えるD3,D5に接続することを前提にする。
赤外線センサはアナログ出力らしい。ラズパイはデジタル信号しか取り扱えないので、工夫が必要になるけど、Arduinoはアナログ/デジタルどちらも使えるので楽。
コメントアウトにしているのは、シリアルモニタで電圧や距離を確認するデバッグ用。
まぁ5m以内、というので反応できればいいので、多少アバウトな数値で取れても問題はない。
なお、距離の算出は以下のサイトを参考にさせていただきました。
Raspberry Piにシャープ製の赤外線距離センサー”GP2Y0A710K”つけてみた: EeePCの軌跡
Arduinoで赤外線測距センサー”GP2Y0A710K”を使ってみた: EeePCの軌跡
4.ハンターカブへの設置
そういえばこのブログには、バイクを持っていることも、それがハンターカブであることも書いてなかった気がする。
設置は以下のように赤外線センサをリアキャリアに二か所設置。
死角検知なので、大体45度ぐらいのところに左右取り付けるようにする。
LEDはウインドスクリーンの金具裏に。
わかりづらいけど赤丸の部分に設置。対向車には光が見えない、かつ運転中でもわかりやすいところに。
本体はボディの空いてるスペースに押し込む。
本当はブレボじゃないほうがいいんだろうけど、ハンダ付け面倒なので…。
実際にはまだ走っていないため、あとは確認しながら調整だなぁ。
【Linux】【Ubuntu18.04】Python3でOracleDBから取得したデータをPostgreSQLに入れる
Python3でOracleDBのデータをそのままPostgreSQLにコピーする必要があったので、やり方をメモ。
1.cx_Oracleをインストール
pipでcx_Oracleのパッケージをインストールします。
このパッケージにてPython3でOracleDBへの接続ができるようになります。
$ python3 -m pip install cx_oracle
Defaulting to user installation because normal site-packages is not writeable
Collecting cx_oracle
Downloading cx_Oracle-8.2.1-cp36-cp36m-manylinux1_x86_64.whl (818 kB)
|????????????????????????????????| 818 kB 153 kB/s
Installing collected packages: cx-oracle
Successfully installed cx-oracle-8.2.1
2.psycopg2をインストール
psycopg2を利用することでPostgreSQLへの接続ができるようになります。
なお、PostgreSQLクライアントのヘッダやライブラリを含んでいるlibpq-dev も必要なので、一緒にインストールする。
$ sudo apt install -y libpq-dev
$ python3 -m pip install psycopg2
3.Pythonプログラム
PythonにてOracleDBの売上テーブルから昨日分のデータを取得し、それをPostgreSQLに格納する、というのを作ります。
PostgreSQLのインサートで失敗した場合、自動でロールバックしてくれる。
コメントの通り、タプル型で取得したデータをそのままINSERTするだけのとてもシンプルな処理になる。
ポスグレのINSERTに関してはexecute_valuesを利用する。なにやらexecuteを利用するより早く処理できるようです。
PostgreSQL - 高速でINSERTしたい君へ - Qiita
基本的に一度接続したコネクションは最後に閉じるようにする。with文で記載するとそこらへんは端折れるので、その方がいいかもしれない。
なお、try文などは省略しています。
Oracleとの接続は、tnsnames.oraで設定する内容と同様のものを定義しておく必要がある。
tnsnames.oraについては以下の記事を参照。
engetu21.hatenablog.com
【Linux】【Ubuntu18.04】OracleDB(10g)への接続
仕事で、というか仕事でしか触らないであろうOracleDBへ、Linuxからのアクセス方法をメモ。
【参考】https://ponsuke-tarou.hatenablog.com/entry/2020/03/09/232129
1.Oracle Instant Clientのダウンロード
まずクライアントをダウンロードする。
ダウンロードサイトは以下。
https://www.oracle.com/jp/database/technologies/instant-client/linux-x86-64-downloads.html
2021年9月時点での最新版をwgetで取得。
Basic Light Package (OL8 RPM)とSQL*Plus Package (OL8 RPM)の二つが必要。
rpmファイルはUbuntuで利用できないけど、後ほどdebファイルに変換する。
$ wget https://download.oracle.com/otn_software/linux/instantclient/213000/oracle-instantclient-basiclite-21.3.0.0.0-1.el8.x86_64.rpm --no-check-certificate
$ wget https://download.oracle.com/otn_software/linux/instantclient/213000/oracle-instantclient-sqlplus-21.3.0.0.0-1.el8.x86_64.rpm --no-check-certificate
※本来はユーザ登録してダウンロードが必要。--no-check-certificateで証明書を無視して強制ダウンロード
2.rpmファイル→debファイルに変換する
$ sudo apt install alien
$ sudo alien oracle-instantclient-basiclite-21.3.0.0.0-1.el8.x86_64.rpm oracle-instantclient-sqlplus-21.3.0.0.0-1.el8.x86_64.rpm
debファイルが作成出来たらそれぞれdpkgで直接指定してインストールを行う。
$ sudo dpkg -i oracle-instantclient-basiclite_21.3.0.0.0-2_amd64.deb
$ sudo dpkg -i oracle-instantclient-sqlplus_21.3.0.0.0-2_amd64.deb
※証明書関連?でwarningが出るが気にしない
sqlplusがインストールできたかを確認する。
$ which sqlplus64
/usr/bin/sqlplus64
3.環境変数の設定
環境変数の変更を行う。
$ vi .bash_profile
↓以下追記# SQL*Plusのインストール場所を指定する環境変数
export ORACLE_HOME=/usr/lib/oracle/21/client64
# UNIXおよびLinux上のライブラリの検索に使用するパスを指定する環境変数
export LD_LIBRARY_PATH=$ORACLE_HOME/lib:$LD_LIBRARY_PATH
# グローバリゼーション機能を指定する環境変数。
export NLS_LANG=Japanese_Japan.UTF8
$ source .bash_profile
で読み込みを行う。(再ログイン以降は自動で追加した環境変数が適用される)
環境変数が適用されているかを確認する。
$ printenv | grep -i oracle
LD_LIBRARY_PATH=/usr/lib/oracle/21/client64/lib:
ORACLE_HOME=/usr/lib/oracle/21/client64
OLDPWD=/usr/lib/oracle/21
PATH=/usr/lib/oracle/21/client64/bin:/home/user/.local/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin
4.コマンド実行確認
sqlplus64が実行できるかを確認。
$ sqlplus64 -V
sqlplus64: error while loading shared libraries: libaio.so.1: cannot open shared object file: No such file or directory
上記エラーが出る場合は、以下のコマンドを実行コマンド
$ sudo apt install libaio1
$ sqlplus64 -V
SQL*Plus: Release 21.0.0.0.0 - Production
Version 21.3.0.0.0
5.OracleDBへの接続設定
どうやらtnsnames.oraというファイルに書いておくとその設定を利用する?らしい。
tnsnames.oraの作成を行う。
設定内容は以下の通りだが、network/admin配下に置くようにマニュアルでも書いてあるようだが、ディレクトリがないので作る
$ cd $ORACLE_HOME/
$ pwd
/usr/lib/oracle/21/client64
$ sudo mkdir network
$ cd network
$ sudo mkdir admin
$ cd admin
$ sudo vi tnsnames.ora XXX = (DESCRIPTION = (ADDRESS_LIST = (ADDRESS = (PROTOCOL = TCP)(HOST = xxx.xxx.xxx.xxx)(PORT = 1521)) ) (CONNECT_DATA = (SID = YYY) ) )
XXXはネットワークサービス名、YYYのSIDは古い記述らしく、SERVICE_NAMEが推奨らしい。
まぁ基本的には管理者などから提供される情報なので、それを利用することになるはず。
HOSTは接続先のIPアドレスを指定する。ホスト名でもいい。
ポートがデフォルトと異なる場合はそれを指定する。
6.OracleDBにログイン
ユーザ名がUSER、パスワードが1234だった場合は、以下のように入力してログインできる。
ユーザ名のところは@に続けてネットワークサービス名を指定する。
$ sqlplus64
ユーザー名を入力してください: USER@XXX
パスワードを入力してください:1234Connected to:
Oracle Database 10g Enterprise Edition Release 10.2.0.5.0 - Production
With the Partitioning, OLAP, Data Mining and Real Application Testing options
SQL>
以上。
【Linux】【Ubuntu18.04】pipのコマンドあれこれ
pipのコマンドを都度忘れるのでメモ。
python3での実行が前提です。
・pipでパッケージをインストール
$ python3 -m pip install xxxx
・pip自身をアップロード
$ python3 -m pip install -U pip
・インストールしているパッケージを羅列
$ python3 -m pip list
・インストール済パッケージの最新バージョンを確認
$ python3 -m pip list -o
【Linux】【Ubuntu18.04】プロキシ環境での設定いろいろ
インターネットへ接続するときの環境がプロキシ経由だった場合。
いろいろ設定しておかないと面倒なので以下のコマンドを実行していく。
プロキシサーバは「proxy.co.jp」とする。
・aptの設定
$ sudo vi /etc/apt/apt.conf.d/apt.conf
Acquire::http::proxy "http://proxy..co.jp:8080";
Acquire::https::proxy "http://proxy.co.jp:8080";
Acquire::ftp::proxy "http://proxy.co.jp:8080";
・pipの設定
$ export HTTP_PROXY=http://proxy.co.jp:8080
$ export HTTPS_PROXY=http://proxy.co.jp:8080
$ python3 -m pip install proxy
※pipでSSLエラーが発生する場合は以下の設定
$ vi ~/.pip/pip.conf・以下を記載
[global]
trusted-host = pypi.python.org
pypi.org
files.pythonhosted.org
・bashの設定
$ vi ~/.bashrc
export http_proxy="http://proxy.co.jp:8080/"
export https_proxy="http://proxy.co.jp:8080/"
export no_proxy="127.0.0.1,localhost,xxx-server.co.jp" ※プロキシを通さないルートはこの設定を入れる
・curlの設定
$ vi ~/.curlrc
proxy=http://proxy.co.jp:8080
【Linux】DELLのタワー型サーバでインテルNICのドライバをインストール
業務で触ったDELLのタワー型サーバ。
Windowsなら問題ないんだけど、Linux(諸事象によりUbuntu18.04 LTS)でNICが認識されずにaptもできんという状況だったので、ドライバを入れるためのメモ。
・NICの確認
$ lspci
00:1f.6 Ethernet controller: Intel Corporation Device 0d4c
末尾の4桁をメモる。
・該当ドライバの検索
https://cateee.net/lkddb/web-lkddb/E1000E.html
ここで先ほどメモった4桁で検索をかける。
vendor: 8086 ("Intel Corporation"), device: 0d4c ("Ethernet Connection (11) I219-LM")
・IntelのサイトからI219-LMに該当するドライバをダウンロード
https://downloadcenter.intel.com/download/15817/Intel-Network-Adapter-Driver-for-PCIe-Intel-Gigabit-Ethernet-Network-Connections-Under-Linux-
・ネットワークドライバのインストールをするためにはmakeが必要。
そしてmakeを実行するためにはgccが必要。
別のマシンからそれぞれ検索をかけてdebファイルをGetする。
$ sudo apt install ./gcc_7.3.0-3ubuntu2_amd64.deb
$ sudo apt install ./make_4.1-9.1ubuntu1_amd64.deb
※ただしNICが死んでる状況なので、関連ライブラリのDLができず失敗する可能性あり。
その場合は、USB接続の有線LANデバイス等で一時的にインターネットにアクセスして作業を進めるしかない。
また、企業内LANなどの場合は、事前にaptに対するプロキシ設定が必要。
プロキシの設定はこちら
engetu21.hatenablog.com
・落としたドライバを解凍してコンパイルとインストール
$ tar zxvf e1000e-3.8.4.tar.gz
$ cd e1000e-3.8.4/src/
$ sudo make install
・サーバの再起動
$ sudo shutdown -r now
【Raspberry Pi】PiVPN(WireGuard)をインストール
過去にPiVPNでOpenVPNをインストールしましたが、何やら最近のPiVPNでは「WireGuard」が利用できるようなので、そちらでインストールしてみました。
■参考サイト
Setting up a WireGuard VPN on the Raspberry Pi - Pi My Life Up
https://qiita.com/Aiyama_R/items/7addb0ed3d67640125b0
https://www.wundertech.net/setup-wireguard-on-a-raspberry-pi-vpn-setup-tutorial/
1.PiVPNのインストール
いきなりですが、前回記載と同様の部分は端折ります。
engetu21.hatenablog.com
この画面でWireGuardを選択
勝手にコマンドが実行されます。
ポート設定する。特に気にならなければデフォルトの「51820」で設定。
2.インストール完了後のユーザ作成
ここは前回と変わらず「pivpn add」で作成。
「pivpn -qr ユーザ名」でAndroidなどのクライアントアプリから読み込めるQRコードを生成できます。
QRコードを読み込まない場合は、生成される[ユーザ名.conf]ファイルをコピーして、アプリでインポートする必要があります。
3.内部LANにアクセスするための設定
$ sudo vi /etc/sysctl.conf
net.ipv4.ip_forward=1
※コメントアウトされていたら取り外す。$ sudo vi /etc/wireguard/wg0.conf
※[Interface]の項目は以下を追加する。
PostUp = iptables -A FORWARD -i wg0 -j ACCEPT; iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
PostDown = iptables -D FORWARD -i wg0 -j ACCEPT; iptables -t nat -D POSTROUTING -o eth0 -j MASQUERADEwg0 はWireGuardがインストールされた時点で仮想インタフェースとして追加される模様。ifconfigで確認可能。
5.VPN接続タイプ
How to Set Up WireGuard on a Raspberry Pi in 2022
の2項にてVPN接続タイプについて説明があります。デフォルトはFull-Tunnel VPNのようですがFree-WiFiなどを利用した際に、自宅のネットワークから接続している形となるため、接続元の隠蔽と接続内容の暗号化によってセキュアな通信になると思われるため(自信はない)、個人的にはデフォルトのままでいいんじゃないかなと思います。
6.感想
OpenVPNより手早く繋がります。それこそボタン押した直後から1秒未満でスッと繋がります。
ただ問題点というか、OpenVPN違い、繋がっているクライアントはVPNサーバ(今回はラズパイ4)のサブネットワークに属している形になるため、内部LANのマシンからは見えない存在になります。
なので、内部LANからVPNクライアントのマシンにアクセスしたいといった用途がある場合は、もう一工夫必要になりそうです。
ヒントは以下参考ページの7項に書いてありますが、ルータの機能にも依存すると思われるため、対応したい人は頑張りましょう。
https://www.wundertech.net/setup-wireguard-on-a-raspberry-pi-vpn-setup-tutorial/