Thursday, June 28, 2012

notes about setting up wifi and camera on a raspberry pi

Has a lot of good notes about the task of adding a driver or drivers to a system and getting it going.

copied here because google lost the item and the web site 404's on it.




Setup of motion, RTL8188CUS realtek based wifi & UVC webcam



2 posts
by nf_ » Tue Jun 05, 2012 9:24 pm
Hi all.

Hopefully this will be of interest and help to someone trying to get a uvc webcam and/or realtek wifi dongle working on their rpi.

I hope this is the correct place to post this kind of topic.

*******************************************************************************************
Why.....

I wanted to have a rpi with a wifi dongle & a uvc logitech webcam and motion installed.

Problem.....
Arch, has the webcam modules but unable to get the rpi arch image to
support either of my 2 RTL8188CUS realtek based dongles.

: Belkin surf n150 micro adapter

: Edimax N150 Wireless nano USB Adaptor

Debian, doesn't immediately work with the dongle, but fairly easy to get working using this great

script: viewtopic.php?f=26&t=6256

But.... the default rpi Debian kernel doesn't have the uvc webcam stuff.

So I cant use the script above, because I need to bake in the webcam.

So...these instructions should enable you to have a:


1) debian based distro (custom kernel)

2) wifi working with RTL8188CUS based adapters.
3) logitech webcam working.


*******************************************************************************************


What you will need

1 x linux machine
1 x rpi
1 x SD card
Wired network between rpi & linux machine
1 X Realtek based wireless dongle. !DO NOT PLUG IN UNTIL TOLD TO!
1 X Logitech webcam

*******************************************************************************************

Getting started..

Prepare SD with the debian6-19-04-2012.zip image from http://www.raspberrypi.org/downloads

Lots of methods to do this.. take a look at:

http://elinux.org/RPi_Easy_SD_Card_Setup

Resize SD card if you need to gparted on your linux machine is your friend.

*******************************************************************************************

Boot for the first time.

Login as the user you have been given as part of the download for your initial image and change the password

Change your user (pi) password

Code: Select all
  # passwd


Change the root passwd

Code: Select all
  # sudo passwd
 


Switch to root

Code: Select all
  # su
 


Enter the password you just changed

Get everything up to date


Code: Select all
  # apt-get update
  # apt-get update [to clear duplicates]
  # apt-get upgrade


At this point I normally (2xpi, 2xpowerAdapters ) get a kernel panic on first upgrade
Just pull plug out and reboot

Login as root this time


Code: Select all
  # apt-get upgrade 
 

I want a fixed IP on this machine so I can find it when i disconnect the monitor
dont do this if you want the wired to be dhcp

*startOfDontDoThisIfYouDontWant


Code: Select all
  # vi /etc/network/interfaces
 


(of course you could you emacs here)


Change the following line


Code: Select all
    iface eth0 inet dhcp

to

Code: Select all
   iface eth0 inet static

    address 192.168.0.80     <---- whatever is applicable to your lan config
    netmask 255.255.255.0    <---- whatever is applicable to your lan config
    network 192.168.0.0      <---- whatever is applicable to your lan config
    gateway 192.169.0.1      <---- whatever is applicable to your lan config
 

Then to write the file

Code: Select all
 :wq!


Code: Select all
   # ifdown eth0
    # ifup   eth0



* if after the next reboot you lose your ability to resolve hostnames

* i.e. ping google.com --> unknown host google.com
* just add:

Code: Select all
nameserver 8.8.8.8   (or your favourite DNS server IP address)


* to the bottom of /etc/resolv.conf

endOfDontDoThisIfYouDontWant


To see (or check ) the address assigned to your eth0 network interface


Code: Select all
  # ifconfig


eth0 inet addr, should be either a dhcp address or the one you set in the interfaces file.


Now I want to install Hexxeh/rpi-update tool

From here: https://github.com/Hexxeh/rpi-update

Code: Select all
 # cd
 # mkdir hexxeh
 # cd hexxeh
 # apt-get install ca-certificates
 # apt-get install git


Code: Select all
 # wget http://goo.gl/1BOfJ -O /usr/bin/rpi-update && chmod +x /usr/bin/rpi-update
 # rpi-update


Dont worry if you get this:


Code: Select all
 /opt/vc/sbin/vcfiled: error while loading shared libraries: libvchiq_arm.so: cannot open shared object file: No such file or directory


* Always happens and no one seems worried about it.

Ok..... lets leave our rpi alone for a minute.


On our second linux (Ubuntu in my case) machine


(A lot of this next bit sourced from here: http://elinux.org/RPi_Kernel_Compilation)

Code: Select all
  # sudo apt-get install gcc-4.6-arm-linux-gnueabi
  # sudo apt-get install git-core 
  # cd 
  # mkdir raspberrypi
  # cd raspberrypi
  # git clone https://github.com/raspberrypi/linux.git
  # cd linux
  # sudo ln -s  /usr/bin/arm-linux-gnueabi-gcc-4.6 /usr/bin/arm-linux-gnueabi-gcc
  # cp arch/arm/configs/bcmrpi_cutdown_defconfig .config
  # make ARCH=arm CROSS_COMPILE=/usr/bin/arm-linux-gnueabi- oldconfig
  # make ARCH=arm CROSS_COMPILE=/usr/bin/arm-linux-gnueabi- -k
 


Depending on your machine this might take a while.

(You can use -j flag if you have multi-core see notes on above url
you might have to press ENTER a lot)

This will have create a kernel image in: /home/yourUser/raspberrypi/linux/arch/arm/boot/

called: "zImage"
Now we need to copy it to our pi

* back on the pi....


Code: Select all
  # apt-get install sshfs
  # cd /mnt
  # mkdir linux
  # sshfs yourUserName@yourLinuxMachineIPorHostname:/home/yourUser/raspberrypi/linux linux
 

You can check it mounted okay by:

Code: Select all
  # df -kh
 


* will show you that /mnt/linux is mounted to yourLinuxMachines linux directory

Code: Select all
# cd linux
  # make modules_install
  # cd /boot
  # cp kernel.img /root/backup-original-kernel.img    
 


Now copy your new kernel over....

Code: Select all
  # cp /mnt/linux/arch/arm/boot/zImage kernel.img
 


You can check it worked by doing this....

Code: Select all
 # diff kernel.img /root/backup-original-kernel.img
  Binary files kernel.img and /root/backup-original-kernel.img differ
 
  #reboot
 


Fingers crossed

Now to get the wireless driver working........

Back on your Linux Machine.


Code: Select all
  # cd
  # cd raspberrypi
  # mkdir wifi
   


Grab the UNIX (Linux) RTL8192CU driver package from
http://www.realtek.com.tw
its a long url... but this shortLink should get you there.... http://goo.gl/81MRD
the file should be called something like this: RTL819xCU_USB_linux_v3.4.2_3727.20120404.zip

* Save the downloaded zip file in the wifi directory you just created

*! there must be a way of building this on the pi but I could not get it to work.
*! annoying as it means I cant use the install script.

Code: Select all
  # cd
  # cd raspberrypi/wifi
  # unzip   RTL819xCU_USB_linux_v3.4.2_3727.20120404.zip
  # cd RTL8188C_8192C_8192D_USB_linux_v3.4.2_3727.20120404
  # cd driver
  # tar -zxvf rtl8188C_8192C_8192D_usb_linux_v3.4.2_3727.20120404.tar.gz
  # cd rtl8188C_8192C_8192D_usb_linux_v3.4.2_3727.20120404/
  # make KSRC=/home/yourUserName/raspberrypi/linux/ ARCH=arm CROSS_COMPILE=/usr/bin/arm-linux-gnueabi- -k
  # ls -ltrh


[you will now see you have a brand spanking new]


8192cu.ko


kernel module, that has been compiled to work with the kernel you prepared earlier.


Back to the rPi

Code: Select all
 # cd /mnt
 # mkdir wifi
 # sshfs yourUserName@yourLinuxMachineIPorHostname:/home/yourUser/raspberrypi/wifi wifi
 # cd /mnt/wifi/RTL8188C_8192C_8192D_USB_linux_v3.4.2_3727.20120404/driver/rtl8188C_8192C_8192D_usb_linux_v3.4.2_3727.20120404
 # cp 8192cu.ko /root
 # cd
 # install -p -m 644 8192cu.ko /lib/modules/3.1.9+/kernel/drivers/net/wireless/
 


Blacklist bad module

Code: Select all
 # echo 'blacklist rtl8192cu' >> /etc/modprobe.d/blacklist.conf
 #
 # echo >> /etc/network/interfaces   <--- put a blank line at the bottom of our interfaces file.
 # echo "allow-hotplug wlan0" >> /etc/network/interfaces   <---- if we want to allow hotplug of our adapter
 # echo >> /etc/network/interfaces
 # echo 'auto wlan0' >> /etc/network/interfaces   <-- create an entry for our wlan0
 # echo >> /etc/network/interfaces
 # echo 'iface wlan0 inet dhcp' >> /etc/network/interfaces  <-- we can change this to static if it works.
 # echo 'wpa-ssid "putYourSSIDhere" ' >> /etc/network/interfaces   <--- this is the name of your wireless Lan.
 # echo 'wpa-psk  "putYourWirelassPasswordHere" ' >> /etc/network/interfaces
 # echo '8192cu' >> /etc/modules
 # depmod -a
 


Ok NOW plug in your wifi usb adapter..

Code: Select all
 # iwconfig
 


You should see something like this......

Code: Select all
lo        no wireless extensions.

eth0      no wireless extensions.

wlan0     IEEE 802.11bgn  ESSID:"YourWifiNetworkName"  Nickname:"<WIFI@REALTEK>"
          Mode:Managed  Frequency:2.462 GHz  Access Point: XX:YY:ZZ:AA:BB:CC 
          Bit Rate:150 Mb/s   Sensitivity:0/0 
          Retry:off   RTS thr:off   Fragment thr:off
          Encryption key:****-****-****-****-****-****-****-****   Security mode:open
          Power Management:off
          Link Quality=94/100  Signal level=44/100  Noise level=0/100
          Rx invalid nwid:0  Rx invalid crypt:0  Rx invalid frag:0
          Tx excessive retries:0  Invalid misc:0   Missed beacon:0


Code: Select all
 # ifconfig
 


Should give you something like this


Code: Select all
wlan0     Link encap:Ethernet  HWaddr XX:YY:ZZ:AA:BB:CC 
          inet addr:192.168.0.80  Bcast:192.168.0.255  Mask:255.255.255.0
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:304 errors:0 dropped:310 overruns:0 frame:0
          TX packets:32 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000
          RX bytes:52965 (51.7 KiB)  TX bytes:4064 (3.9 KiB)


Back on your linuxMachine

Code: Select all
# ping 192.168.0.81
64 bytes from 192.168.0.81: icmp_seq=0 ttl=64 time=0.993 ms
 


Lets reboot and make sure it all works then.....

Code: Select all
# reboot


Ok... the goal of this for me is a rpi with wifi, camera and motion so actually I need to set
the wifi address to be static so I can connect to it, otherwise it will keep changing and without
a keyboard and screen attached it will be a pain.

Login to your rpi as root (or just prefix all commands with sudo, up to you.)


Code: Select all
   # vi /etc/network/interfaces
   


change the following line

Code: Select all
    iface wlan0 inet dhcp
 

to

Code: Select all

    iface wlan0 inet static
    address 192.168.0.81     <---- whatever is applicable to your lan config, not an address handed by your dhcp server
    netmask 255.255.255.0    <---- whatever is applicable to your lan config
    network 192.168.0.0      <---- whatever is applicable to your lan config
    gateway 192.169.0.1      <---- whatever is applicable to your lan config
 


Then to write the file

Code: Select all
  :wq!


Code: Select all
    # ifdown wlan0
    # ifup   wlan0
    # ifconfig
 


This should give you something like this

Code: Select all
wlan0     Link encap:Ethernet  HWaddr XX:YY:ZZ:AA:BB:CC 
          inet addr:192.168.0.80  Bcast:192.168.0.255  Mask:255.255.255.0 
   



Back on your linux machine open a terminal window and


Code: Select all
 # ssh root@9192.168.0.81
 


* enter your password

Code: Select all
## hostname
raspberrypi


OK all good, we dont need a screen or keyboard anymore.

Now unplug the keyboard from the rpi, we will need the usb for your webcam.
Plug your webcam in

Code: Select all
 # dmesg  (in your terminal window)


You should see something like this...


Code: Select all
usb 1-1.2: new high speed USB device number 6 using dwc_otg
usb 1-1.2: New USB device found, idVendor=046d, idProduct=0825
usb 1-1.2: New USB device strings: Mfr=0, Product=0, SerialNumber=2
usb 1-1.2: SerialNumber: AB81D3F0
Linux video capture interface: v2.00
uvcvideo: Found UVC 1.00 device <unnamed> (046d:0825)
input: UVC Camera (046d:0825) as /devices/platform/bcm2708_usb/usb1/1-1/1-1.2/1-1.2:1.0/input/input2
usbcore: registered new interface driver uvcvideo
USB Video Class driver (1.1.1)
6:3:1: cannot set freq 16000 to ep 0x86
6:3:2: cannot set freq 24000 to ep 0x86
6:3:3: cannot set freq 32000 to ep 0x86
6:3:4: cannot set freq 48000 to ep 0x86
usbcore: registered new interface driver snd-usb-audio
rtw_set_ps_mode(): Busy Traffic , Leave 802.11 power save..
rtl8192c_set_FwPwrMode_cmd(): Mode = 0, SmartPS = 0


* I have tried this with the following webcams...
* logitech c120
* logitech c160

* lets see if a video device has been created.

Code: Select all
# ls -ltrh /dev/video*
crw-rw---- 1 root video 81, 0 Jun  4 18:42 /dev/video0


* ok good.
* almost there..

Install motion

Code: Select all
# apt-get install motion
# apt-get install uvcdynctrl
# apt-get install guvcview
# vi /etc/motion/motion.conf


Change: webcam_localhost on --> webcam_localhost off <--- this means we will be able to see the camera stream from other machines
Change: videodevice /dev/video0 To whatever video device was shown by ls -ltrh /dev/video*

Optional (but these are my settings):
Change: width 320 --> width 640 This will depend on your camera model.
Change: height 240 --> height 480
Change: framerate 25 --> http://www.lavrsen.dk/foswiki/bin/view/ ... nFramerate
Change: webcam_maxrate 25 --> http://www.lavrsen.dk/foswiki/bin/view/ ... camMaxrate
Change: output_normal on --> off , Im happy just to have the avi I can always jpeg split later if i want

Code: Select all
:wq!   <--- Save your settings and exit.


Lets try it.

Code: Select all
# motion 


All done.

*******************************************************************************************

Hopefully this will be of use or interest to others, its quite long so if you spot any mistakes
feel free to point them out.

*******************************************************************************************
I have read a lot of web pages trying to get all this to work, and Im sure I will have forgotten
the authors of some.

But…thanks and credit to those below :

MrEngman --- viewtopic.php?f=26&t=6256
everyone who wrote this: http://elinux.org/RPi_Kernel_Compilation
http://elinux.org/index.php?title=RPi_K ... on=history

Cian's Blog --- http://www.cianmcgovern.com/tag/8192cu/
Hexxeh ---http://hexxeh.net/
Kenneth Lavrsen -- for maintaining motion. 

 http://www.69b.org/prox-pi.php/rpo/phpBB3/viewtopic.php?f=28&t=7585&p=93108&sid=e3ed9faa65b23072b6a52ada67d7d6a4