顯示具有 raspberry pi 標籤的文章。 顯示所有文章
顯示具有 raspberry pi 標籤的文章。 顯示所有文章

2015年7月9日 星期四

Raspberry pi – IOERROR Too many open files



Reference:

測試到一半發現有這個奇怪的bug,後來才發現原來是linux的問題
輸入指令ulimit -a 可以看到目前的系統設定,open file現在只有1024


$sudo nano /etc/security/limits.conf



重新開機後再看一次ulimit -a 則會看到已經更改的設定



Python standard deviation




要算標準差要先下載numpy package
windows下很麻煩 沒有64bits package
但在raspberry pi下只要輸入指令

$pip install numpy

使用numpy來算標準差如下


後來用excel來比對數值的時候發現open office excel用的標準差公式跟python不一樣
數值有點小差距

標準差公式

excel是用 n-1,python 是用n

2015年6月17日 星期三

Run shell script by double clicking icon

Reference

在桌面環境建立一個自己用的icon,裡面放入要跑的shell script 與想要的圖案
點擊滑鼠兩下就會直接執行,不需要再按一次execute


在桌面上建立xxx.desktop 檔案,名稱自取
$sudo nano Desktop/test.Desktop

鍵入shell script 與圖案的絕對路徑與顯示名稱
[Desktop Entry]
Name=My Icon
Comment=run script
Exec=/home/pi/......./xxx.sh
Icon=/home/pi/......./xxx .gif
Terminal=false
Type=Application

然後按Ctrl+X


就可以在桌面上看到自己建立的Icon,顯示的名稱會是My Icon,不是test.Desktop




2015年6月8日 星期一

Realtime Raspberry Pi clock with DS1307



Reference:

raspberry pi 裡面沒有clock,他必須要接到網路,使用網路上的NTP(Network Time Protocol)來校正clock
如果沒有網路的話,也可以用realtime clock IC DS1307來存及時的時間

先下載I2C tools,可以參考如下
http://flyhighla.blogspot.de/2015/01/install-i2c-on-raspberry-pi.html

之後連接DS1307Pi,如果還在測試的階段可以先不用接電池,電池要接3V
PII2C已經有內建pull up resistor

DS1307 - Pi
VCC - 5V
GND - GND
SCL - SCL
SDA - SDA

DS1307 X1,X2上接Crystal

鍵入指令
$ sudo i2cdetect -y 1

如果連接正確會得到I2C的位置0x68


$ sudo su
$ echo ds1307 0x68 > /sys/class/i2c-adapter/i2c-1/new_device

如果成功的話,應該什麼都不會出現

$ sudo hwclock -r
如果第一次讀的話,會顯示2000
這時候需要鍵入 $ sudo hwclock -w 把正確的時間寫入RTC


他會跟Pi的時間同步

如果Pi的時間跟妳的不一樣的話,用指令sudo raspi-config來調整時區

輸入下列指令讓Pi下次從開機時自動讀取RTC存的時間
$ sudo nano /etc/modules

在下面加入


$ sudo nano /etc/rc.local
exit 0前面加入這兩行
echo ds1307 0x68 > /sys/class/i2c-adapter/i2c-1/new_device

sudo hwclock -s







2015年5月15日 星期五

Enable spi on raspberry pi



Reference:

做了上一篇的one wire 以後,突然發現我lsmod,竟然看不到spi
執行python 時也發現下列的錯誤
但是spi/etc/modprobe.d/raspi-blacklist.conf 中的blacklist我明明有拿掉阿


後來發現可能是kernal版本的問題,所以spidisable掉了

所以輸入下列指令
sudo nano /boot/config.txt

在最下面輸入
dtparam=spi=on


同理也可以用在i2c上面



Raspberry pi communicate with DS1820

Reference:



vdddata pin之間接一個4.7 -10k的電阻

輸入下列指令,注意系統不能是唯讀
$sudo nano /boot/config.txt

在最後面加入這行,如果gpiopin可以自己選擇
dtoverlay=w1-gpio,gpiopin=4,pullup=on

重新開機

接下來我按照reference中輸入
sudo modprobe w1-gpio sudo modprobe w1-therm
都得到下面的錯誤訊息,但是這不會影響結果

接下來可以看 one wire是否有找到temperature sensor,通常會是28開頭之類
然後可以Cat 他的值來







import os
import glob
import time

os.system('modprobe w1-gpio')
os.system('modprobe w1-therm')
base_dir = '/sys/bus/w1/devices/'
device_folder = glob.glob(base_dir + '28*')[0]
device_file = device_folder + '/w1_slave'

def read_temp_raw():
    f = open(device_file, 'r')
    lines = f.readlines()
    f.close()
    return lines

def read_temp():
    lines = read_temp_raw()
    while lines[0].strip()[-3:] != 'YES':
        time.sleep(0.2)
        lines = read_temp_raw()
    equals_pos = lines[1].find('t=')
    if equals_pos != -1:
        temp_string = lines[1][equals_pos+2:]
        temp_c = float(temp_string) / 1000.0
        temp_f = temp_c * 9.0 / 5.0 + 32.0
        return temp_c, temp_f
    
while True:
    print(read_temp())
    time.sleep(1)

os.system 是用來執行系統指令

glob 可以用來取出資料夾下特定的檔案類型,譬如說取出所有的png





2015年4月20日 星期一

Change Raspberry PI Hostname

使用Samba 在同個網路下有多台Raspberry PI
如果每個PI的名子相同,只會顯示一個PI
所以需要改變PIHostname

$sudo nano /etc/hostname


改完名字後sudo reboot即可

2015年3月30日 星期一

MCP3208 communicate with raspberry pi

Reference:

用了這個多輸入的adc才知道之前mcp3201這樣的寫法真的很蠢! 哈哈哈!
明明就可以用spi bus,真是蠢斃了我 = =





依照Reference 這樣聰明又簡單的解法,需要先畫個圖解,我需要single end,所以SGL1

Din . . . . . 1 1 2 | 1 0 x x x x x x | x x x x x x x x
Dout 0 0 0 0 0 1 1 0 | 0 0 0 0 0 0 0 0 | 0 0 0 0 0 0 0 0

raspberry pi 需要輸出三個bytes,使adc可以輸出start bit與位址
第一個byte(0000011?) + (adcnum左移兩位(也就是剩最高位D2))
第二個 byte adcnum3and,保留最後兩位(D1,D0),然後右移六位
第二個 byte 為零
r = spi.xfer2([(6 + (adcnum >> 2)), ((adcnum &3) << 6), 0])



這同時adc 同時接收三個bytes,只有r[1]r[2],才是我們需要的資料
r[1] and 15(0b1111)確保資料,再連接後面的byte,集成12 bits
adcout = ((r[1] & 15) << 8) + r[2]

下面用兩個ADC,ce0,ce1每間隔一秒測一次電壓
import RPi.GPIO as GPIO
import time
import spidev
import time


GPIO.setmode(GPIO.BCM)
GPIO.setwarnings(False)

Vref = 3.8
spi = spidev.SpiDev()


def readadc(adcnum):
    if adcnum > 7 or adcnum < 0:
        return -1
    r = spi.xfer2([(6 + (adcnum >> 2)), ((adcnum &3) << 6), 0])
    adcout = ((r[1] & 15) << 8) + r[2]
    return adcout

while True:
    spi.open(0, 0)
    value = readadc(0)
    voltage = value*(Vref/4096)
    print ("voltage adc1: %0.3f" %voltage)
    time.sleep(1)
    spi.open(0, 1)
    value = readadc(0)
    voltage = value*(Vref/4096)
    print ("voltage adc2:: %0.3f" %voltage)
    time.sleep(1)





2015年2月16日 星期一

Raspberry SD Card 唯讀



### unionfs

### aufs

### tmpfs
http://raspberrypi.stackexchange.com/questions/5112/running-on-read-only-sd-card


Reference:


### busybox syslog


為了要避免SD卡因為電源插拔損壞,我想要將他改成read only
在網路上搜尋了一下,發現大家的做法很像,但是又不全部一樣
我在試unionfs的時候, 大部分的部落客都是參考同一個德文的網站
我設定完後重開機,進入了raspbien的開機畫面
照理說raspbien的預設使用者名稱為pi,密碼為raspberry
但是我就是沒有辦法進入桌面,看了一下在德文跟英文下面的留言
也有些人跟我一樣遇到這樣的情形,但是沒有人提出真正可能的解決方法
當然我也不是那個咖可以自己找到方法()
不過很多人寫說unionfs很不好用,建議用aufs

所以我又到處尋尋覓覓,試了其他幾個部落客的方法,他們都沒有用unionfs,而是用tmpfs,
但是很多都是在/dev/mmcblk0p1/dev/mmcblk0p2中都設ro(read only),我試了以後開機直接進入黑屏.......

後來又搜尋到referece中的寫的方法,但是他只設/dev/mmcblk0p1read only
只有這樣我才能順利開機,但是這方法是不是真的能讓sd卡不受摧毀????
只能待時間來證明了!!!
但是最重要的還是要更加深入的了解linux!!!!


$ sudo nano /etc/defaults/rcS
在最後加入
RAMTMP=yes
但是之後不知道長時間開機的話會不會造成記憶體空間不足?
如果安裝時造成記憶體空間不足,需要把這個參數改成no

開機時,會根據/etc/fstab裡面的內容,把需要的裝置掃瞄一遍
$ sudo nano /etc/fstab



鳥哥的網站對此有詳細的說明 (http://linux.vbird.org/linux_basic/0230filesystem.php)
掛載限制
根目錄 / 是必須掛載的﹐而且一定要先於其它 mount point 被掛載進來。
    其它 mount point 必須為已建立的目錄﹐可任意指定﹐但一定要遵守必須的系統目錄架構原則
    所有 mount point 在同一時間之內﹐只能掛載一次。
    所有 partition 在同一時間之內﹐只能掛載一次。
    如若進行卸載﹐您必須先將工作目錄移到 mount point(及其子目錄) 之外。
下面六個參數
1. 掛載的系統位置
  1. 要被掛載的目錄
  2. 系統檔案類型
  3. 系統檔案參數
    ro : read only
    nodev : 允許此 partition 上,可建立裝置檔案
    nosuid : 允許此 partition 含有 suid/sgid 的檔案格式
    noatime: 別記錄讀取時間, 會造成部份程式失常。
    Errors : remount-ro - 重新掛載檔案系統成只讀模式,可以令系統有限度地繼續運作但減低損害檔案系統資料的機會。
    defaults : 同時具有rw, suid, dev, exec, auto, nouser, async 等參數。 基本上,預設情況使用 defaults 設定即可!
    Mode = 1777 : 粘滯位(Sticky bit),或粘著位,是Unix文件系統許可權的一個旗標。最常見的用法在目錄上設置粘滯位,如此以來,只有目錄內文件的所有者或者root才可以刪除或移動該文件。如果不為目錄設置粘滯位,任何具有該目錄寫和執行許可權的用戶都可以刪除和移動其中的文件。
  4. 能否被 dump 備份指令作用: 0 代表不要做 dump 備份, 1 代表要每天進行 dump 的動作。 2 也代表其他不定日期的 dump 備份動作, 通常這個數值不是 0 就是 1 啦!
  5. 是否以 fsck 檢驗磁區: 開機的過程中,系統預設會以 fsck 檢驗我們的 filesystem 是否完整 (clean)。 不過,某些 filesystem 是不需要檢驗的,例如記憶體置換空間 (swap) ,或者是特殊檔案系統例如 /proc /sys 等等。所以,在這個欄位中,我們可以設定是否要以 fsck 檢驗該 filesystem 喔。 0 是不要檢驗, 1 表示最早檢驗(一般只有根目錄會設定為 1)2 也是要檢驗,不過 1 會比較早被檢驗啦! 一般來說,根目錄設定為 1 ,其他的要檢驗的 filesystem 都設定為 2 就好了。

最後一個參數預設是2,之前做失敗的版本/dev/mmcblk0p1也都是保持2,但是這個成功的 版本是1,不確定是不是也有關連?

Tmpfs (http://zh.wikipedia.org/wiki/Tmpfs):
tmpfs在類Unix作業系統上是一個常見的名稱會用來做為暫時的檔案儲存方式,在更多的情況下,它會用虛擬的記憶體而不是一個永久保存的媒體來做為在檔案系統上的使用。
所有在 tmpfs 上儲存的資料在理論上都是暫時借放的,那也表示說,檔案不會建立在硬碟上面。一旦重新開機,所有在 tmpfs 裡面的資料都會消失不見。理論上,記憶體使用量會隨著 tmpfs 的使用而時有增長或消減。目前有許多 Unix 的發行版都有啟用 tmpfs ,預設是把它以共享記憶體的方式用在系統的/tmp 目錄底下。
tmpfs 在 Linux kernel 2.4 之後的版本都有支援。tmpfs(之前比較為人所知的名稱是 "shmfs")和 Linux 的 ramdisk 裝置定位有所不同。 Ramdisk 是固定劃分一塊記憶體出來使用,且允許比較不常用的頁面可以移動到置換空間去。
tmpfs 的用法,舉例來說是像: "mount -t tmpfs -o size=1G,nr_inodes=10k,mode=0700 tmpfs /space" 這樣就會使用 GiB 的置換空間,裡頭有 10240 inodes 且規定是在 /space 目錄底下存取。這個檔案系統的大小是可以隨時調整的,像是再追加一個指令如:mount -o remount,size=2G /space"要註記一點,如果/tmp 有安全上的顧慮的話,最好追加 sticky bit 上來. 就是權限應該被設作 "mode=1777" ,而不是 "mode=0777 "mode=777"


$ sudo nano /etc/init.d/hwclock.sh

60行的地方把-f改成-L



$ sudo nano /etc/init.d/hwclock.sh
裡面加入這行
BLKID_FILE="/var/local/blkid.tab"

修正mtabmounted file systems table這種檔案記錄著當前已掛載的檔案系統以及它們的初始化選項 )
sudo rm /etc/mtab
sudo ln -s /proc/self/mounts /etc/mtab

/etc/apt/apt.conf:這個並不是 APT Server 的記錄檔,而是當我們在指令列模式下達 APT 的指令時 (如底下執行檔部分會介紹的 apt-get ),該指令的環境參數。一般來說,使用預設值就可以了!不需要更動他。

如果使用者用apt-get則會自動remountrw,但是如果NO_APT_REMOUNT -no,則保持為Read Only
$ sudo nano /etc/apt/apt.conf


可以下command讓系統改回rw
mount -o remount,rw /

或是回到ro
mount -o remount,ro /

mount可以看到下列


----------------------------- 另一種方法分隔線 -------------------------------

後來我又看到有些人寫另一種方法用busybox syslog
很興奮的試了一下,結果竟然進入command line模式...
而且還要輸入帳號密碼,變成兩個都要寫pi
linux 一竅不通的我完全不知道怎麼回事
我猜是前面幾個移除不需要的配件時,應該把自動登入的設定拿掉了(我自己猜的)

所以我試了一下先不要移除任何東西
然後下載busybox syslog

The reason for doing this is because we do not want logfiles, but we want to be able to do some debugging (read logfiles). busybox-syslogd does not write logfiles but logs to a ring-buffer in memory which can be displayed using the logread command:
apt-get install busybox-syslogd
dpkg --purge rsyslog

/etc/init.d/checkroot.sh /etc/init.d/checkfs.sh 裡面case 1 下的do_start 註解起來
再把 /etc/init.d/checkroot-bootclean.sh 下的這兩個註解起來
rm -f /tmp/.clean /lib/init/rw/.clean /run/.clean /run/lock/.clean
clean_all


移除啟動時的script
insserv -r bootlogs
insserv -r sudo
insserv -r alsa-utils
insserv -r console-setup
insserv -r fake-hwclock

/etc/fstab 內改成,這跟上面的方法不同
proc /proc proc defaults 0 0
/dev/mmcblk0p1 /boot vfat defaults,ro 0 2
/dev/mmcblk0p2 / ext4 defaults,ro 0 1
tmpfs /tmp tmpfs defaults 0 0

最後一個是要把 /boot/cmdline.txt 的最後加上ro,但是如果加上了ro,就會變黑屏無法開機
後來我在windows,boot裡面的這個ro拿掉才可以順利開機


我的感覺是雖然好像把系統改成read only,只要把/etc/fstab 內的其中一個或是兩個partition改成ro,但是其他的配套措施,每個人有自己不同的解決方法,所以在搜尋的過程中其實真的是混亂!


如果第一種方法不是真的read only,可能可以換成第二種方法試試吧??