2017年12月30日土曜日

Report VL53L0X TOF sensor

超音波センサーセンサの代替に、STのVL53L0Xを検証中
野外で使うので、やはり野外でテスト

(1) TOF部分に、光が当たる状態でどうか?

(2) 乱反射するような生地の場合はどうか?

結論を言えば、室内ほどの性能はでないけど、本来の目的につかう範囲においては野外環境でもOK。

(1)に関しては、やはり50㎝以上は難しく、ただTOF表面に日光が差し込まなようにすれば、性能の改善はできる。データも取れたので、それを解析してプログラムに仕込めば大丈夫。

(2)に関しては、野外でよく着るナイロン地のアウターが直射日光に当たる状態でテスト。これは、OK

まぁ、いろいろテストで、、、
GPSをNTPで使うテストも、これはやはりネットに出ている方法ではうまくいかない事がわかったので、ちょっと細工すればOK

年の瀬に、、、Peace!!









Building a Raspberry Pi3 Stratum-1 NTP Server (u-blox 6)


1.基本的な考え方

野外活動用のロボットを開発している。
室内では、電源や、ネットワークなど当たり前にあるけど、野外では無いんだなぁ。。。
ネットワークも、LTEつなげればというけど、、、Docomoの携帯電波が取れない所もあり、、、
逆に、そのような所の方が、自律移動型ロボットのニーズが強いわけで、、、

ネットワーク、電源などは、本当にいろいろ考えさせれる。
ネットワークが届かなければ、ロボットのコントローラのRaspberry Piだって時刻同期ができないという事があり、、、RTCを積めばよいというけど、RTC積んだって同期は必要なわけで、、、

となると解決は、Raspberry Pi自身がGPSを使ってStratum-1のNTPサーバになればよいという変身技、、、

本当は、GPSからとれるtimepluseも一緒に使えば良いけど、それが無いGPSモジュールでも、一秒はずれるかもしれないけど、その程度なら野外ロボットを運用するためには、まずは許容範囲。

まずは、u-blox 6で、次は、timepluse付きのu-blox 8

2.環境

私の場合は、OSはStretchなので以下の説明は、全てStretch前提
Raspberry Piは、2B、3
GPSは、Amazonで購入したのは、これ!

安さ重視(^^)

3.手順

因みに、通常のOSインストールの場合は、NTPクライアントとしては、systemd-timesyncdが動いている。リモートサーバに時刻を同期する為のクライアント側のデーモン。NTPクライアントとして、定期的にNTPサーバと時刻を同期する。
timedatectlコマンドを使うと状態が解る。

timedatectl status
Local time: Fri 2017-12-29 23:54:41 JST
Universal time: Fri 2017-12-29 14:54:41 UTC
RTC time: n/a
Time zone: Asia/Tokyo (JST, +0900)
Network time on: yes
NTP synchronized: yes
RTC in local TZ: no

すでに、gpsdは、インストールしてあるものとして、、、
gpsdのインストールは、ここ

sudo apt-get install ntp
sudo vi /etc/ntp.conf
cat /etc/ntp.conf

変更・追加箇所だけ

# pool.ntp.org maps to about 1000 low-stratum NTP servers.  Your server will
# pick a different set every time it starts up.  Please consider joining the
# pool: <http://www.pool.ntp.org/join.html>
#server 0.debian.pool.ntp.org iburst
#server 1.debian.pool.ntp.org iburst
#server 2.debian.pool.ntp.org iburst
#server 3.debian.pool.ntp.org iburst

または、(raspberry Pi 2B)
#pool 0.debian.pool.ntp.org iburst
#pool 1.debian.pool.ntp.org iburst
#pool 2.debian.pool.ntp.org iburst
#pool 3.debian.pool.ntp.org iburst

# Generic NMEA GPS Reciever
#server 127.127.20.0 minpoll 4 prefer
#fudge 127.127.20.0 refid GPS flag1 0
#server ntp.nict.jp iburst
#これは、USB接続などのGPSを使う場合。
#この時は、gpsxのデバイスファイルを作る必要がある
#sudo ln -s /dev/ttyAMA0 /dev/gps0


#この指定(28)は、gpsd のshare memoryを使う指定
#GPSと、ないけどPPSの指定をしている。
server 127.127.28.0 minpoll 4
fudge  127.127.28.0 time1 0.183 refid NMEA
server 127.127.28.1 minpoll 4 prefer
fudge  127.127.28.1 time1 0.183 refid PPS

127.127.28.0は、IPアドレスでは無くて
https://www.eecis.udel.edu/~mills/ntp/html/refclock.html
ここに説明があるReference Clock Supportの番号
gpsdを立ち上げた場合は、28と指定する。

ところで、time1は遅延の設定値。PPS使わないのでNMEAに0.183秒の遅延幅の設定をしても意味がないと思われるで、
結局このセクションは、以下ように設定をした。

server 127.127.28.0 minpoll 4
fudge  127.127.28.0 flag1 1 refid NMEA
server 127.127.28.1 minpoll 4 prefer
fudge  127.127.28.1 time1 0.183 refid PPS


sudo reboot
または、su
sudo ssytemctl restart ntp

ntpq -p




SHMは、Shared Memoryの略。gpsdをSHMを介してやりとりしている。
/etc/ntp.confではインターネット上のサーバは指定していないので、
上図のようになる。*SHM(0)の'*'は、gpsが採用されている事を現わす。


Peace!!

自分が納得するうえで参考になったリンク。ありがとうございました。

http://lowfreq.info/archives/18314

https://www.eecis.udel.edu/~mills/ntp/html/refclock.html

https://blog.cles.jp/item/7932

補足


2つのdaemonが走っており、かつGPSがgpsd経由でNTPサーバになっている
という事で、、、(^^)/


表 13-4. 符号の意味
符号意味
*現在同期中のサーバーです。
+参照可能なサーバーです。
#距離は遠いものの参照可能なサーバーです。
空白距離が遠いなどの理由で参照しないサーバーです。
x検査で参照不可能と判断されたサーバーです。
.参照しているサーバーが多いために外されたサーバーです。
また、ntpq -p コマンドが出力する各列の意味は以下の通りです。
remote
参照先の NTP サーバーの名前です。
refid
参照先の NTP サーバーがどこから時刻を取得しているかを示します。サーバーのホスト名や GPS.などが表示されます。
st
Stratum の階層を示しています。
t
l(local)、u(unicast)、m(multicast)、b(broadcast)を示します。
when
参照先の NTP サーバーからのパケットを最後に受信してからの経過時間を秒単位で表示します。
poll
ポーリング間隔を秒単位で表示します。
reach
NTP サーバーへの接続を試みた最後の 8 回分の結果を 8 進数で表示しています。8 ビットのビット列で結果を保持しており、サーバー接続できた場合はビットが立ちます。したがって全部成功した場合は、377 と表示されます。
delay
時刻同期要求に対する返答時間をミリ秒単位で表示します。
offset
NTP サーバーと自ホストの時刻の誤差をミリ秒単位で表示します。
jitter
ばらつきをミリ秒単位で示しています。値が低い方が、正確な時刻同期が可能であることをあらわします。

2017年12月28日木曜日

VL53L0X TOF sensor on Raspberry Pi

ロボット用の距離センサーが欲しくて、、
通常よく用いられる超音波センサーは扱いにくいので
STのVL53L0Xを試すが、これが、いいんだなぁ、、、(^^)

3V〜5Vの入力電圧を内部電圧2.8V へ変換するレギュレータが付いている
ストロベリー・リナックスのモジュールを使う
https://strawberry-linux.com/catalog/items?code=15310


この時に、既についているプルアップ抵抗(10KΩ)を2つ取り外す(写真赤の部分)

これをRaspberry PiにI2C接続するとこんな感じ


テスト
ディレクトリーの関係は、、、
~/prj/VL53L0X/VL53L0X_1.0.2
                      /VL53L0X_rasp

(1) APIのダウンロード
STのsiteからAPIをダウンロードする(http://www.st.com/content/st_com/en/products/embedded-software/proximity-sensors-software/stsw-img005.html
ログインの処理が間にあり、指定したメールアドレスにURLを送ってくる
それをダウンロードする。解凍するとVL53L0X_1.0.2のディレクトリーができる
unzip en.STSW-IMG005.zip
ls
VL53L0X_1.0.2

(2) サンプルプログラムダウンロード
git clone https://github.com/cassou/VL53L0X_rasp
cd VL53L0X_rasp
API_DIR=../VL53L0X_1.0.2 make
API_DIR=../VL53L0X_1.0.2 make examples
./bin/vl53l0x_ContinuousRanging_Example

こんな感じで、、、

Peace!!

2017年12月26日火曜日

An installation shell script of openCV3.4.0

Raspberry Pi3
Stretch
3時間41分

バージョンの確認は、、、

/usr/local/bin/opencv_version
3.4.0

Peace!!

---------------------------------------------------------------

#! /bin/bash

date;

if [[ `lsb_release -d` =~ .*Raspbian.* ]]
then
        echo "";
        read -p " Continue installing OpenCV (y/n) ? " CONTINUE
        if [[ "$CONTINUE" == "y" || "$CONTINUE" == "Y" ]]; then
                echo "";
                echo "Installing OpenCV";
                echo "";
                sudo apt-get update -y && sudo apt-get upgrade -y
                sudo apt-get install -y build-essential cmake pkg-config
                sudo apt-get install -y libjpeg-dev libtiff5-dev libjasper-dev libpng12-dev
                sudo apt-get install -y libavcodec-dev libavformat-dev libswscale-dev libv4l-dev
                sudo apt-get install -y libxvidcore-dev libx264-dev
                sudo apt-get install -y libgtk2.0-dev libgtk-3-dev
                sudo apt-get install -y libatlas-base-dev gfortran
                sudo apt-get install -y python2.7-dev python3-dev

                cd ~
                wget -O opencv.zip https://github.com/opencv/opencv/archive/3.4.0.zip
                unzip opencv.zip
                wget -O opencv_contrib.zip https://github.com/opencv/opencv_contrib/archive/master.zip
                unzip opencv_contrib.zip
                                mv ~/opencv_contrib-master ~/opencv_contrib-3.4.0
                cd ~/opencv-3.4.0/
                mkdir build
                cd build
                cmake -D CMAKE_BUILD_TYPE=RELEASE \
                      -D CMAKE_INSTALL_PREFIX=/usr/local \
                      -D INSTALL_PYTHON_EXAMPLES=OFF \
                      -D OPENCV_EXTRA_MODULES_PATH=~/opencv_contrib-3.4.0/modules \
                      -D BUILD_EXAMPLES=OFF ..
                make
                sudo make install
                sudo ldconfig
        else
                echo "";
                echo "Skipping OpenCV installation";
                echo "";
        fi
else
        echo "Installing opencv python for non-Raspbian";
        sudo -H pip3 install opencv-python
        sudo -H pip3 install opencv-contrib-python
fi
date;

2017年12月24日日曜日

An installation of NEO-6M GPS onto Raspberry3


こんなことをする為にU-blox NEO-6M GPSモジュールをAmzonでget

Raspberry Pi3+Stretch+GPSの設定です。
Raspberry Pi3は、Bluetoothが、シリアルポートを使っているので、
これを、ハズす事が必要。
いろいろ調べて、試しながら、こんな感じ(^^)

gpsdについては、ここここも

GPS用語集は、ここ



因みに、Raspberry PiとGPSの接続は普通のUARTの接続です。
説明は省略。GPS電場がちゃんと受信できている時は、青いLEDが点滅

1.1 raspi-config

Serial portを有効にします。こんな感じ。raspi-config終了時にreboot選択
「シリアル接続でのログインはしないけど、シリアル使うよ」という設定





2.1 /boot/config.txt

sudo vi /boot/config.txt

# Enable audio (loads snd_bcm2835)
dtparam=audio=on
#start_x=0
gpu_mem=64
enable_uart=1
#dtoverlay=w1-gpio

dtoverlay=pi3-disable-bt
#dtoverlay=pi3-miniuart-bt          # blurtoothを使うとき

2.2 /boot/cmdline.txt

/boot/cmdline.txtの「console=ttyAMA0,115200」の部分を削除

sudo vi /boot/cmdline.txt
cat /boot/cmdline.txt
dwc_otg.lpm_enable=0 console=tty1 root=/dev/mmcblk0p2 rootfstype=ext4 elevator=deadline fsck.repair=yes rootwait

sudo reboot
sudo cat /dev/ttyAMA0


2.3 install

sudo apt-get install gpsd gpsd-clients python-gps
sudo vi /etc/default/gpsd
cat /etc/default/gpsd
# Default settings for the gpsd init script and the hotplug wrapper.

# Start the gpsd daemon automatically at boot time
START_DAEMON="true"

# Use USB hotplugging to add new USB devices automatically to the daemon
USBAUTO="true"

# Devices gpsd should collect to at boot time.
# They need to be read/writeable, either by user gpsd or the group dialout.
DEVICES="/dev/ttyAMA0"

# Other options you want to pass to gpsd
GPSD_OPTIONS="-n"

GPSD_OPTIONS="-F /var/run/gpsd.sock -b -n"
これは、ntpサーバーにする時

#udo gpsd /dev/ttyAMA0 -F /var/run/gpsd.sock
#stty -F /dev/ttyAMA0

sudo reboot

stty -Fは、open and use the specified DEVICE instead of stdin
という意味だから、設定するのはおかしいね。
だから、ここは sudo rebootのみで、、、
reboot後は、

systemctl status ntp gpsd
ntp -p

で確認する。
gpsdが立ち上がっていない時は
sudo systemctl start gpsd

でも、大事な事は原因を把握して、対処する事

2.4 確認

scgps -s

xgps

Peace!!

ところで、いろりろな情報があるけど、、、
Raspberry Pi2、だったり、Jessieだったり
少し混乱しました。

sudo cat /dev/ttyAMA0  で、文字化けなどの時
sudo systemctl stop serial-getty@ttyAMA0.service
sudo systemctl disable serial-getty@ttyAMA0.service

もしおかしい時は、この情報を参照して、AMA0関連の余計なサービスが無いか確認する

systemctl | grep tty
  sys-devices-platform-serial8250-tty-ttyS0.device                                                   loaded active plugged   /sys/devices/platform/serial8250/tty/ttyS0
  sys-devices-platform-soc-3f201000.serial-tty-ttyAMA0.device                                        loaded active plugged   /sys/devices/platform/soc/3f201000.serial/tty/ttyAMA0
  sys-devices-virtual-tty-ttyprintk.device                                                           loaded active plugged   /sys/devices/virtual tty/ttyprintk
  getty@tty1.service                                                                                 loaded active running   Getty on tty1     
  system-getty.slice                                                                                 loaded active active    system-getty.slice 
  getty.target                                                                                       loaded active active    Login Prompts


Raspberry Pi3+Jessieのとき、下のおまじない必要らしいけど
Stretchではしない。

sudo systemctl stop serial-getty@ttyS0.service
sudo systemctl disable serial-getty@ttyS0.service


参考リンク

本家
https://www.raspberrypi.org/documentation/configuration/uart.md

http://mcommit.hatenadiary.com/entry/2016/09/07/233816

http://blog.robit.co.jp/entry/20170411

http://www.neko.ne.jp/~freewing/raspberry_pi/raspberry_pi_3_serial_gps/

https://www.rs-online.com/designspark/add-gps-time-and-location-to-a-raspberry-pi-project-jp

http://ain0204.hatenablog.com/entry/2015/08/30/235729




おわり(^^)

2017年12月14日木曜日

Setup Pimoroni HyperPixcel on Raspberry Pi Stretch to use TensorFlow

PimoroniのHyperPixcel購入した。
セットアップ自体は、このURLの通りやればすんなり、こんなにきれいな画面(写真2枚目)が手に入る


Raspberry Pi3に、Movidiusをくっつけて、Webcamで撮った画像をTensorFlowで画像認識した結果を、HyperPixcelで見るという単純な事をしている訳で、、、
何気に良いんですね。
キーボードも、もっと早く買えば良かったのに、、、と
優れモノ、、、

で、このセットで何をするんだって、、、
内緒(笑)

Peace!!




An installation of lighttpd(1.4.48) on Raspberry Pi Stretch

僕は、相も変わらず、lighttpdを使っているわけで、、、
apt-getでインストールすると 1.4.45
でも、最新は、1.4.48

今回は、クリーンインストールするので、、、

wget https://download.lighttpd.net/lighttpd/releases-1.4.x/lighttpd-1.4.48.tar

tar xvf lighttpd-1.4.48.tar
cd lighttpd-1.4.48.tar
./configure
make -j4
sudo make install

で、、、?

/etc/lighttpdが無い、、、躊躇せず

sudo make clean
sudo apt-get install lighttpd
sudo make install
lighttpd -v
lighttpd/1.4.48 - a light and fast webserver

よしよし、、、

cd /etc/lighttpd/conf-enabled
sudo ln -s ../conf-available/10-cgi.conf 10-cgi.conf
sudo cp ../conf-available/10-cgi.conf ../conf-available/10-cgi.conf.org

sudo vi ../conf-available/10-cgi.conf
cat ../conf-available/10-cgi.conf
# /usr/share/doc/lighttpd/cgi.txt

server.modules += ( "mod_cgi" )

$HTTP["url"] =~ "^/cgi-bin/" {
        cgi.assign = ( "" => "" )
}
$HTTP["url"] =~ "^/api/" {
        cgi.assign = ( "" => "" )
}
## Warning this represents a security risk, as it allow to execute any file
## with a .pl/.py even outside of /usr/lib/cgi-bin.
#
#cgi.assign      = (
#       ".pl"  => "/usr/bin/perl",
#       ".py"  => "/usr/bin/python",
#)

sudo systemctl restart lighttpd
cd /var/www/html
sudo mkdir api
cd api

sudo vi q1.c
cat q1.c
#include <stdio.h>
#include <stdlib.h>

void main(void);

void main(void)
{
  char *s_dt;
  long m,n;

  printf(" Content-Type:text/html;charset=utf-8\n\n");
  printf("<html><title>Test C-Language CGI</title><body>\n");
  printf("<H3>Result</H3>\n");
  s_dt = getenv("QUERY_STRING");
  printf("<P>%s\n", s_dt);

  if(s_dt== NULL)
    printf("<P>no argument.");
  else if(sscanf(s_dt,"m=%ld&n=%ld",&m,&n)!=2)
    printf("<P>not numeric.");
  else
    printf("<P>result %ld x %ld = %ld.",m,n,m*n);

  printf("</body></html>\n");

  return;
}

sudo gcc q1.c -o q1

で、、、他のマシンのChromeで
http://192.168.11.166/api/q1?m=10&n=20
とすると、、、画面に、以下のように表示されて、めでたしめでたし(^^)

Result

m=10&n=20
result 10 x 20 = 200.

という事で、、、呪文を唱えた感じだけど、、、

Peace!!

2017年12月6日水曜日

An installation bcm2835 library in Raspberry Pi and testing spi program

Adafruit PiTFT3.5を間違えて購入してしまった。



もったいないので、ロボットの簡易的なディスプレーにしようと思い、サイトに書いてあるGPIOをつないだけど動かない。もちろん直付けすると動くけど、他のGPIOが使えなので、、、

<追記>
初稿を書いた後に、Pin1の3.3Vを接続したら、ディスプレーとして動きました。SPIの件は、変わらずですが、、、
ディスプレーとして動いたので良しとします。
デバイスファイルは、/dev/input/touchscreen以外にもあると思うけど、、、
いつかちゃんと確認するという事で、、、
</追記>

ということで、写真のように接続した時に、SPIちゃんと動いているのかしら
その為にSPIのテスト

(2) bcm2835 libraryのインストール(最新バージョンは都度確認)

wget http://www.airspayce.com/mikem/bcm2835/bcm2835-1.52.tar.gz
./configure
make
sudo make install

(2) SPIのテスト

ls /dev/spi*
ls: cannot access /dev/spi*: No such file or directory

なぬ?

lsmod
.
.
snd                    68784  5 snd_timer,snd_bcm2835,snd_pcm
i2c_bcm2835             6433  0
spi_bcm2835             7424  0
bcm2835_gpiomem         3791  0
uio_pdrv_genirq         3718  0
.
.

cat t1.c

#include <bcm2835.h>
#include <stdio.h>
int main(int argc, char **argv)
{
    if (!bcm2835_init())
        return 1;
    bcm2835_spi_begin();
    bcm2835_spi_setBitOrder(BCM2835_SPI_BIT_ORDER_MSBFIRST);      // The default
    bcm2835_spi_setDataMode(BCM2835_SPI_MODE0);                   // The default
    bcm2835_spi_setClockDivider(BCM2835_SPI_CLOCK_DIVIDER_65536); // The default
    bcm2835_spi_chipSelect(BCM2835_SPI_CS0);                      // The default
    bcm2835_spi_setChipSelectPolarity(BCM2835_SPI_CS0, LOW);      // the default
    uint8_t send_data = 0x23;
    uint8_t read_data = bcm2835_spi_transfer(send_data);
    printf("Sent to SPI: 0x%02X. Read back from SPI: 0x%02X.\n", send_data, read_data);
    if (send_data != read_data)
      printf("Do you have the loopback from MOSI to MISO connected?\n");
    bcm2835_spi_end();
    bcm2835_close();
    return 0;
}

gcc -o t1 t1i.c -l bcm2835

./t1
Segmentation fault

だめだぁ、、、

(3) 直付け


ls /dev/spi*
ls: cannot access /dev/spi*: No such file or directory

あれ?
でも、PiTFT動いているし、、、???

./t1
Segmentation fault

ダメだぁ、、、

(4) SPI Off


sudo reboot

ハングアップしするので、電源Off-Onで再起動、、、

ところが、UIでるんだなぁ、、、(笑)

どうなっているのでしょうか?
何で、接続されているのかしら、、、
SPIではないのかしら、、、、

とっても、Peaceではない。

2017年12月4日月曜日

lighttpd 1.4.48 インストール

ロボットコントローラーには、lighttpdを使って

RDCSのRESTモドキや、ロボットのコントロールに活用している。

最新が、1.4.48 になっていたのでインストール

./configure
make
sudo make install

確認すると、

$ lighttpd -v
lighttpd/1.4.48 - a light and fast webserver

めでたし、めでたし、

Peace!!