2019年2月26日火曜日

MariaDB復活

前回のブログの内容だけど、
問題は、壊れたSDカードがDBサーバだった言う事

これは大問題で、今更一からデータを入れるかというと、、、
固まってしまう。

もう、、、ブルーブルーブルー
いや、暗黒、暗黒、暗黒

でも、普及で来たのでメモとして記録

最近忘れやすいんだなぁ

(1) 起動しなくなったRaspberry PiのSDカードから必要なデータを抜き出す

これは大事な作業で、結論から言うとVMware を使った。
VMwareの良さに気が付いたので、worksation proを購入した。

SDカードをVMwareのハードディスクとして認識させて中のデータを救助する。これは、MacでもFUSEで同じ事ができる。
ただし、Macはread onlyなので、fsckなど使って回復処置はできない。

VMwareでマウントしたディスクに対してfsckも実行したけど機動ディスクとしての再起動はできなかった。

救出した部分は、DBデータ、開発環境とWebサーバ環境
/var/lib/sql
/home/pi
/var/www

失敗しののは、/etc/mysqlを保存しなかった事。
ただ、開発用のマシンに、同じ環境が構築してあったのでそれを参照すれば大丈夫

(2) 素人は怖い

まぁ。私はmysqlに関しては素人なわけで、、、
新しいSDカードにOSや、mysql-server等々とインストール。
/var/lib/mysqlをリネームして、上記で救出した/var/lib/mysqlをコピー。

で、、、
で、、、

rootでログイン。前のSDカードのパスワードを入れる
お!login 出来た。



感動したなぁ。
他の機能も実行、webからの検索もOK
あ~、春の陽射しが気持ちい~

Peace!!

2019年2月23日土曜日

Raspberry Pi 3B+ SDカード 修復

Raspberry Piを2013年の7月から使っているけど
始めて、SDカードの問題でシステムが立ち上がらなくなった。

原因は、電源のブチ切れ

ただ、対象のマシンはMySQLを運用していたので、DBのデータを可能な限り復旧させたかった。

それで、いろいろ調べて結局VMwareを使って修復作業
MacでFUSE使ったけど、一部のファイルの救出はできたけど、read onlyの為にSDカードの復旧はできず。
DBのフォルダーは、Xが付いたままでした。その他にも試したけど ZVR Xも対応できなかった。
で、一番面倒くさそうなVMwareを使う事に。

昔のVMwareしか知らないので、抵抗感もあったけど、、、
ビックリVMware凄いじゃん

最初は無料版をインストールしたけど、Proのライセンスを購
これは、Raspberry Piが無くてもWindowsマシンで開発ができるメリットが大きいと判断した。

1.VMwareのインストール

これは、ダウンロードして、インストールして終わり
詳しい事は、他の方のブログを参照

2.VMwareに仮想OSインストールと設定

Raspberry Piとの関係を考えて、Debianをインストール
Debianのサイトから、isoイメージをダウンロードし、このイメージを使って仮想マシンのセットアップ

fsck -fn /dev/sdb2 実行中

3.修復

rootでログイン
対象のSDカードをPC(Let's note)のUSBにBuffaloのアダプター経由で接続。MCR-A27/U2という大昔のモノですが、これで接続する事によりDebianが自動的に認識をしてくれた。




df で、マウント先とデバイスを確認
/dev/sdb2でした。ちなみに/dev/sdb1は、/boot

fsck -fn /dev/sdb2
エラーのオンパレード。too many なんてメッセージ出てくるし (泣)

意を決して、、、
fsck -fy /dev/sdb2

あれ?
エラー....fsckは、e2fsckを呼びだしているから

e2fsck -p /dev/sdb2
マウントされているからダメ!

umount /dev/sdb2

e2fsck -p /dev/sdb2
なんか、すぐ終わり、不安になり

fsck -fn /dev/sdb2
出るわ出るわエラー

fscl -fy /dev/sdb2
54GBもあるから、、、時間がかかる。でも進んでいる。

もう一度、-fnオプションで、、、だいぶ減ったけどエラー
で-、-fyオプションで、、、

(4)結果

ダメでした。
成果は、VMwareがとっても便利な事が解った事(笑)

Peace!!



2019年2月18日月曜日

Raspberry Pi と CAN接続

僕は、複数のRaspberry Piを使ってロボットを開発している。

問題になるのは、Raspberry Piの同期で、、、

今までは、GPIOを使って同期をとっていたけど

これからは、CAN接続で同期をとる

そんな事をしなくても、Wifiでやればいいじゃんと思う人もいると思うけど

でも、、、その質問には答えない

こんな感じで

Peace!!



2019年2月10日日曜日

lighttpd 最新版をbuild , 環境設定する時の手順

lighttpd は、ロボットのHTTP通信で使っている
なんといっても軽量で早い

これはでは、一度 aptでインストールしてから、上書きしていたけど、
最初から、最新版のインストールしちゃう手順。

まぁ、シェル化すればいいんだけど、それは今度



手順は、下に記述しました。

Peace!!

#-----------------------------------------------------------
#step1 install
#-----------------------------------------------------------
mkdir tmp
cd tmp
wget https://download.lighttpd.net/lighttpd/releases-1.4.x/lighttpd-1.4.53.tar.gz
tar xvf lighttpd-1.4.53.tar.gz
cd  lighttpd-1.4.53
sudo apt-get -y install libpcre3-dev bzip2 libbz2-dev
./configure
make
sudo make install
sudo ldconfig

#-----------------------------------------------------------
# step2 systemd
#-----------------------------------------------------------
which lighttpd
sudo cp doc/systemd/lighttpd.service /lib/systemd/system
sudo vi /lib/systemd/system/lighttpd.service
# change /usr/sbin/lighttpd -> /usr/local/sbin/lighttpd

sudo systemctl enable lighttpd.service

#-----------------------------------------------------------
# step3 /etc/lighttpd
#-----------------------------------------------------------
sudo mkdir /etc/lighttpd
sudo cp doc/config/lighttpd.conf /etc/lighttpd
sudo cp doc/config/modules.conf /etc/lighttpd
sudo cp -r doc/config/conf.d /etc/lighttpd

cd /etc/lighttpd
sudo vi lighttpd.conf
var.server_root = "/var/www"
#server.use-ipv6 = "enable"
server.username  = "www-data"
server.groupname = "www-data"
#server.document-root = server_root + "/htdocs"
server.document-root = server_root

sudo vi modules.conf
 "mod_alias"
 include "conf.d/cgi.conf"

sudo vi conf.d/cgi.conf
#######################################################################
##
##  CGI modules
## ---------------
##
## See https://redmine.lighttpd.net/projects/lighttpd/wiki/docs_modcgi
##
server.modules += ( "mod_cgi" )

##
## Plain old CGI handling
##
## For PHP don't forget to set cgi.fix_pathinfo = 1 in the php.ini.
##
#cgi.assign                 = ( ".pl"  => "/usr/bin/perl",
#                               ".cgi" => "/usr/bin/perl",
#                               ".rb"  => "/usr/bin/ruby",
#                               ".erb" => "/usr/bin/eruby",
#                               ".py"  => "/usr/bin/python" )
#
##
## to get the old cgi-bin behavior of apache
##
## Note: make sure that mod_alias is loaded if you uncomment the
##       next line. (see modules.conf)
##
#alias.url += ( "/cgi-bin" => server_root + "/cgi-bin" )
alias.url += ( "/api" => server_root + "/api" )
$HTTP["url"] =~ "^/api" {
   cgi.assign = ( "" => "" )
}

##
#######################################################################

#-----------------------------------------------------------
# step4 /var/www /var/log/lighttpd /var/run/lighttpd.pid
#-----------------------------------------------------------
sudo mkdir /var/www
sudo mkdir /var/www/api
cd /var/www
sudo vi index.html

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>lighttpd alive</title>
</head>
<body>
<p>lighttpd server success/p>
</body>
</html>

sudo chown -R www-data:www-data /var/www

sudo mkdir /var/log/lighttpd
sudo chown -R www-data:www-data /var/log/lighttpd

sudo touch /var/run/lighttpd.pid
sudo chown www-data:www-data /var/run/lighttpd.pid

sudo systemctl start lighttpd

#-----------------------------------------------------------
# step5 cgi
#-----------------------------------------------------------
cd /var/www/api
sudo vi test.c

#include <stdio.h>

void main(){
        printf("Content-type: text/plain\n\n");
        printf("Hello, World!");
        return;
}

sudo gcc test.c -o test


//EOF

2019年1月24日木曜日

Set up CAN device and software on Raspberry Pi 3B+

自分なりの忘備録です。

まずは、こんな感じ

とっても参考になったのは、こちらで、ありがとうございました。

OBD2(CAN)で自動車と通信(ソフト編)
Raspberry Pi で CAN通信(準備)

でも結局、大本のこちらで確認した。
上記のURLもここを見ている。
[quick-guide] CAN bus on raspberry pi with MCP2515



こんな感じで、CAN コントローラMCP2515との通信もOK




まず、ネットで購入したRaspberry Piを対象のCANシステムに接続するためのモジュールは、写真上のモジュール
USB接続の数万円のモノから、このモジュールのように$2のモノまでいろいろ、、、
中国製だから、本当にMCP2515は怪しいけど、、、
もう、昔のような状態ではないと思うので、、、

このモジュールは、Amazonでもいろいろあり、、、どれが本物?
そもそも、本物があるのか?
そんな感じで、同じようなものがたくさんある。

ただ、いずれにせよ、このモジュールのややっこしいのは、

[quick-guide] CAN bus on raspberry pi with MCP2515

に書いてあるように、回路を切らないとならないこと
あと、V5の電源を基盤に接続する事



ただ、切らなくても、CANのソフトは動いたのだぁ、、、
テストは、これでする。

手間取ったのは、5Vの電源を基板上にはんだ付けする事
直径の小さな穴をあけてRaspberry Piの5V GPIOをつなげる加工をする。



この加工は、穴あけ、半田の乗りが悪いなど、意外と大変で手間取った。

これができれば、GPIO 25番を INTとした下の配線をすればよい。
INT の番号は、config.txtに設定する時に必要なので決めてする。
まぁ、いろいろな例もGPIO25だから25で良いとおもう。


配線は、以下の様に接続

Module    Pin No

INT              22
SCK            23
SI                19
SO               21
CS               24
GND            25
VCC(3.3)     17

VCC(5V)        2

CAN GND      6

ソフトは、いろいろな所に書いてあるように

sudo vi /boot/config.txt

dtparm=spi=on

dtoverlay=mcp2515-can0,oscillator=8000000,interrupt=25
dtoverlay=spi-bcm2835

この25番が、moduleのINT

CANのソフトをインストール

git clone https://github.com/linux-can/can-utils.git
cd can-utils
./autogen.sh
./configure
make
sudo make install
reboot

立ち上がってcan0があればOK

 /sys/class/net/can0

こんな感じでも確認できる
dmesg
[    4.160946] CAN device driver interface

[    4.201788] mcp251x spi0.0 can0: MCP2515 successfully initialized.


で、CANのおまじない

sudo ip link set can0 type can bitrate 500000 loopback on
sudo ifconfig can0 can0: flags=128<NOARP> mtu 16 unspec 00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00 txqueuelen 10 (UNSPEC) RX packets 0 bytes 0 (0.0 B) RX errors 0 dropped 0 overruns 0 frame 0 TX packets 0 bytes 0 (0.0 B) TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0

candump can0 read: Network is down


もういっちょおまじない,,,というか最初にこうすればよい(笑)

sudo ifconfig can0 up

つまり、下記ような簡単なシェル。ネットの起動は最終的にはserviceにする
loopback on は自己チェックの時だけなのでCANに接続する場合

#!/bin/bash
sudo ip link set can0 type can bitrate 500000
sudo ifconfig can0 up

Raspberry PiとMCP2515との間での通信テスト

candump can0

さらにもう一つターミナルを開いて入力する

cansend can0 00001234#FFAA00CC22DD33FF

と、入力すると、candumpを入力したターミナルに2枚目の写真のように現れる。

Peace!

2019年1月20日日曜日

An Installation of OpenCV4 on Raspberry Pi 3B+ & 4B

OpenCV4に本格的に移行する為にBuldする。  2019/8/12更新

最初に確認するのは、OpenCVのインストールページ

真っ新のRaspiにインストールする。
これは僕のやり方なのでディレクトリーは読み替えて下さい。
homeディレクトリーが散らかるのが嫌なので
~/prj/cv4を作りそこで作業をしている。
swapファイルは拡張する。
sudo vi /etc/dphys-swapfile
CONF_SWAPSAIZE=100 -> 1024
sudo /etc/init.d/dphys-swapfile restart
swapon             確認

RaspberryPi 4B  Buster
この組合せはまだ安定していないのかなぁ。
apt installでもエラーが発生する場合もあるし、build途中でもエラーが発生
/usr/bin/ld: ../../lib/libopencv_core.so.4.1.1: undefined reference to `__atomic_compare_exchange_8'
/usr/bin/ld: ../../lib/libopencv_core.so.4.1.1: undefined reference to `__atomic_fetch_sub_8'
/usr/bin/ld: ../../lib/libopencv_core.so.4.1.1: undefined reference to `__atomic_load_8'
/usr/bin/ld: ../../lib/libopencv_core.so.4.1.1: undefined reference to `__atomic_store_8'
/usr/bin/ld: ../../lib/libopencv_core.so.4.1.1: undefined reference to `__atomic_fetch_add_8'
collect2: error: ld returned 1 exit status
make[2]: *** [apps/version/CMakeFiles/opencv_version.dir/build.make:85: bin/opencv_version] エラー 1
make[1]: *** [CMakeFiles/Makefile2:12504: apps/version/CMakeFiles/opencv_version.dir/all] エラー 2
cmakeの赤字分が追加の回避設定

cd
time sudo apt install -y \
    build-essential cmake pkg-config libcurl4-openssl-dev intltool devscripts debhelper  ant \
    libldap2-dev libgtkmm-3.0-dev libarchive-dev \
    libjpeg-dev libtiff5-dev libpng-dev  libjpeg-dev \
    libavcodec-dev libavformat-dev libswscale-dev libv4l-dev \
    libxvidcore-dev libx264-dev \
    libgtk2.0-dev libgtk-3-dev \
    libcanberra-gtk* \
    gfortran python2.7-dev python3-dev  \
    libavresample-dev libtesseract-dev libleptonica-dev \
    libgstreamer1.0-dev  libgstreamer-plugins-base1.0-dev libhdf5-dev \
    libblas-dev libeigen{2,3}-dev  libatlas-base-dev liblapacke-dev \
    python3-numpy python-numpy libjasper-dev

python2関連のライブラリーを削除した
time sudo apt install -y \
    build-essential cmake pkg-config libcurl4-openssl-dev intltool devscripts debhelper  ant \
    libldap2-dev libgtkmm-3.0-dev libarchive-dev \
    libjpeg-dev libtiff5-dev libpng-dev  libjpeg-dev \
    libavcodec-dev libavformat-dev libswscale-dev libv4l-dev \
    libxvidcore-dev libx264-dev \
    libgtk-3-dev \
    libcanberra-gtk* \
    gfortran python3-dev  \
    libavresample-dev libtesseract-dev libleptonica-dev \
    libgstreamer1.0-dev  libgstreamer-plugins-base1.0-dev libhdf5-dev \
    libblas-dev libeigen3-dev  libatlas-base-dev liblapacke-dev \
    python3-numpy  libjasper-dev


大体、7~8分。3B+は早い (^^)
raspi4 だと2分

mkdir prj/cv4
cd prj/cv4

wget https://github.com/opencv/opencv/archive/4.1.2.zip -O opencv-4.1.2.zip; wget https://github.com/opencv/opencv_contrib/archive/4.1.2.zip -O opencv_contrib-4.1.2.zip; unzip opencv-4.1.2.zip; unzip opencv_contrib-4.1.2.zip; cd opencv-4.1.2; mkdir build; cd build

cmake-guiを使って環境を作るのがおすすめ。
例えば下記の CPU_BASELINE=NEONは
ENABLE_NEON=ONとENABLE_VFPV3=ONと同時に設定するとエラーになる。
ITT、EIGEN、ITT等はチェックを外す。EIGENは使わない。
PYTHON2もサポートが2020年までなので、PYTHON3に移行する為にチェックを外す。
下の赤字は付け加える。
それくらいかなぁ、、、

//---------------------------------------------
// Raspi 4  Buster
//---------------------------------------------
cmake-guiを使うときは下記の設定をする。
特に、赤字をAdd Entryする。python2,EIGENの項目を消す。
CPU_BASE_LINE系は削除して、NEON、VFPV3はENABLEで設定
でも、この関係良く分からない。cmakeでエラーの出ない設定。
以下をコピペするのではなく、cmake設定するのが良い
下も動くけど、、、

time cmake -D CMAKE_BUILD_TYPE=RELEASE \
   -D BUILD_EXAMPLES=ON \
   -D BUILD_TESTS=OFF \
   -D BUILD_SHARED=OFF \
   -D CMAKE_INSTALL_PREFIX=/usr/local/ \
   -D CMAKE_CXX_FLAGS=-latomic \
   -D CPU_BASELINE=NEON \
   -D ENABLE_NEON=ON \
   -D ENABLE_VFPV3=ON \
   -D ENABLE_LTO=OFF \
   -D ENABLE_PRECOMPILED_HEADERS=OFF \
   -D INSTALL_C_EXAMPLES=ON \
   -D INSTALL_PYTHON_EXAMPLES=ON \
   -D OPENCV_SKIP_PYTHON_LOADER=ON \
   -D OPENCV_PYTHON3_INSTALL_PATH=/usr/local/lib/python3.7/dist-packages \
   -D OPENCV_EXTRA_EXE_LINKER_FLAGS=-latomic \
   -D OPENCV_EXTRA_MODULES_PATH=../../opencv_contrib-4.1.2/modules \
   -D OPENCV_GENERATE_PKGCONFIG=ON \
   -D WITH_TBB=OFF \
   -D WITH_OPENCL=OFF \
   -D WITH_GSTREAMER=ON ..

time make -j4

real    67m43.556s
user    252m19.934s
sys     17m26.788s

build/binにbuild されたサンプル、contribが入っている

python3でimport cv2 エラーがでる
対策はここ
-DCMAKE_CXX_FLAGS=-latomic          → build 確認済み 9/1
-DOPENCV_EXTRA_EXE_LINKER_FLAGS=-latomi

vmware上でbuild する時は、青字の部分削除してcmake する

//---------------------------------------------
// Raspi 3B+ Strech
//--------------------------------------------- 
cmake -D CMAKE_BUILD_TYPE=Release \
    -D CMAKE_INSTALL_PREFIX=/usr/local \
    -D OPENCV_EXTRA_MODULES_PATH=~/prj/cv4/opencv_contrib-4.1.1/modules \
    -D ENABLE_VFPV3=ON \
    -D ENABLE_NEON=ON \
    -D BUILD_TESTS=OFF \
    -D WITH_TBB=OFF \
    -D INSTALL_PYTHON_EXAMPLES=ON \
    -D OPENCV_SKIP_PYTHON_LOADER=ON \
    -D OPENCV_PYTHON2_INSTALL_PATH=/usr/local/lib/python2.7/dist-packages \
    -D OPENCV_PYTHON3_INSTALL_PATH=/usr/local/lib/python3.5/dist-packages \
    -D OPENCV_GENERATE_PKGCONFIG=ON \
    -D BUILD_EXAMPLES=OFF ..

time make -j4

                             基本同じcmake設定
                             raspi4で、、、
                             real    104m18.468s
                             user    185m40.628s
                             sys     13m25.275s

                             raspi3B+
                             real    154m58.275s
                             user    550m24.650s

                             sys     16m18.052s

                             real:実行時間
                             user:CPU
                             sys:OSが処理をした時間
                             4coreの合計値がuser?

sudo make install
sudo ldconfig

cd ../samples/cpp
g++ `pkg-config opencv4 --cflags --libs` facedetect.cpp -o facedetect -std=c++11 -latomic

./facedetect  --cascade="../../data/haarcascades/haarcascade_frontalface_alt.xml" --scale=1.5 ../data/lena.jpg

お久しぶりです Lenaさん
.
ところで、g++でエラーが発生した。
一度うまくできたのに、ある時からエラー
それで、exampleのコードを参考に、facedetect,cpp 先頭の
includeのコメントアウトを外して、g++したら成功
なんで、できなくなったのだろう?


Peace!!

2019年1月14日月曜日

これからの生産の自動化

生産の自動化は、どの業種でも、これから大事な事であり、僕もその分野にだんだん足を突っ込んでいる。

まだ、いろいろ自分の考えをまとめている途中だけど、こんな感じで考えている。

・機械が定められた動作を繰り返す

・機械が能力範囲の仕事を自律制御する。つまり、人が制御プログラムを書き換える事がない。かつ、最適解を求めて学習する。

・生産プロセスにおけるバッファ―を人が制御する。

・生産プロセスにおける工程管理を自律的に制御する。

つまり、個の機能とプロセスの機能だけど、この協調が最も必要なのだろうと、、、

これって、実は人の組織と同じで、人が自律的に動き、そして彼らが協調する組織ってやはり、パフォーマンスが高いわけで、、、

このように考えた時、必要になる事がいろいろ見えてくる。

それを、一つ一つ作って、実現するのが今の仕事、、、

世界中に工場を持つグローバル企業と共同研究をする事になった。

また未踏の世界に、足を突っ込んでしまった。

その時のデータ集めに、このロボットが役立つとは、考えてもみなかった。


Peace!!