Multiple webcams on ZoneMinder
阅读原文时间:2023年07月11日阅读:1

Monitoring a 3D Printer

I have tidied my new workshop and I am starting to play with 3d-printing again.

One of the ideas I've been thinking about for some time is remote monitoring of the printing process. Many prints can take several hours to complete and I don't have enough confidence to leave it alone for that long. Jumping up and down to check it every few
minutes would quickly get annoying, so I wanted a way to control and monitor it from a web interface.

My plan is to use a few webcams to provide pictures of the bed, print, and overall mechanics, and an emergency stop button. Looking around, the best solution for webcam streaming on Linux (Ubuntu) is ZoneMinder -
it can cope with streaming multiple webcams. I used apt-get to install it and there are some extra configuration required in the documentation.
I can also point a couple of cameras out the window as a home-made CCTV/security solution.

After a bit of fiddling, I was able to get streaming webcam from my PS3 eye webcam: but the other three webcams refused to stream. This was a little odd, since I could happily get pictures using cheese, kamino, xawtv, and they all seemed to connect properly
as /dev/video devices and appeared as v4l2 (VideoForLinux) devices. All drivers seemed OK and installed.

xawtv -c /dev/video0 -v 1 can provide useful information, such as the supported colour palettes.

Checking the zoneminder logs ( appearing in /tmp):

tail -f /tmp/zmdc.log

24/06/11 22:14:03.046389 zmdc[2171].INF [Starting pending process, zmc -d /dev/video3]
24/06/11 22:14:03.047635 zmdc[2171].INF ['zmc -d /dev/video0' starting at 11/06/24 22:14:03, pid = 2869]
24/06/11 22:14:06.224901 zmdc[2171].ERR ['zmc -d /dev/video0' exited abnormally, exit status 11]

And I was also getting messages in 

dmesg

[ 1929.678445] gspca: bandwidth not wide enough - trying again
[ 2529.745525] ohci_hcd 0000:00:0b.0: leak ed ffff880036a43730 (#85) state 2

Checking the USB devices looked OK:

davidr@hgwells:~$ lsusb
Bus 002 Device 008: ID 046d:c049 Logitech, Inc. G5 Laser Mouse
Bus 002 Device 007: ID 056a:0013 Wacom Co., Ltd Graphire 3 4x5
Bus 002 Device 006: ID 05f3:0007 PI Engineering, Inc. Kinesis Advantage PRO MPC/USB Keyboard
Bus 002 Device 005: ID 0ac8:307b Z-Star Microelectronics Corp. USB 1.1 Webcam
Bus 002 Device 004: ID 05f3:0081 PI Engineering, Inc. Kinesis Integrated Hub
Bus 002 Device 003: ID 093a:2600 Pixart Imaging, Inc. Typhoon Easycam USB 330K (newer)/Typhoon Easycam USB 2.0 VGA 1.3M/Sansun SN-508
Bus 002 Device 002: ID 041e:4053 Creative Technology, Ltd Live! Cam Video IM
Bus 002 Device 001: ID 1d6b:0001 Linux Foundation 1.1 root hub
Bus 001 Device 006: ID 05ac:1293 Apple, Inc. iPod Touch 2.Gen
Bus 001 Device 002: ID 1415:2000 Nam Tai E&E Products Ltd. or OmniVision Technologies, Inc. Sony Playstation Eye
Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
davidr@hgwells:~$

but checking the USB tree shows that the 3 problem devices are only connecting in USB 1.1 (12M), and the one working device at USB 2.0 (480M).

davidr@hgwells:~$ lsusb -t
1-5:3.0: No such file or directory
/: Bus 02.Port 1: Dev 1, Class=root_hub, Driver=ohci_hcd/8p, 12M
|__ Port 2: Dev 2, If 0, Class=vend., Driver=zc3xx, 12M
|__ Port 4: Dev 4, If 0, Class=hub, Driver=hub/4p, 12M
|__ Port 2: Dev 6, If 0, Class=HID, Driver=usbhid, 12M
|__ Port 2: Dev 6, If 1, Class=HID, Driver=usbhid, 12M
|__ Port 3: Dev 7, If 0, Class=HID, Driver=wacom, 1.5M
|__ Port 4: Dev 8, If 0, Class=HID, Driver=usbhid, 12M
|__ Port 4: Dev 8, If 1, Class=HID, Driver=usbhid, 12M
|__ Port 6: Dev 5, If 0, Class=vend., Driver=zc3xx, 12M
/: Bus 01.Port 1: Dev 1, Class=root_hub, Driver=ehci_hcd/8p, 480M
|__ Port 1: Dev 2, If 0, Class=vend., Driver=ov534, 480M
|__ Port 1: Dev 2, If 1, Class=audio, Driver=snd-usb-audio, 480M
|__ Port 1: Dev 2, If 2, Class=audio, Driver=snd-usb-audio, 480M
|__ Port 5: Dev 6, If 0, Class=still, Driver=, 480M
|__ Port 5: Dev 6, If 1, Class=vend., Driver=usbfs, 480M

Damn. It looks like I forgot the rule about mixing usb 1 and 2 devices -Plugging usb 1 and 2 forces everything on that hub to run as USB 1 (UPDATE : false).

Mixing around the ports, I still had problems. As a better solution, I've ordered a PCI-E USB 3.0 card and usb3 hub. Each port should  happily accept a 2.0 webcam, and should have plenty of bandwidth.

I usually use ebuyer.com, but in this case amazon.co.uk were a lot cheaper! (Usb3.0 card for £10 - hub for £20)

UPDATE:

It seems that the other cameras I had were, in fact, usb1.1 - (even though a couple were labelled as USB 2).  A later experiment with four identical USB 2.0 cameras had similar results.

The main problem does seem to be the USB bandwidth. Apparently cameras 'reserve' USB bandwidth (sometimes more than they use) and the usb 2.0 480Mb limit quickly gets used up. I'll post again after testing with USB3.0 (5Gb)

USB 1.1 and USB 2.0
I was incorrect in my earlier post. Modern motherboards usually have two usb controllers: a USB 2.0 controller and a 'legacy' USB 1.1 controller. Devices
on each port are automatically switched to the right controller, so the problem of one usb 1 device slowing down the whole usb system does not occur.

I suspect something similar is implemented on most usb hubs - my USB 2.0 hub seems to cope fine with a mix of 1.1 and 2.0 devices.

Due to the wording of the USB 2.0 spec, some USB 1.1 webcams are labelled as USB 2.0 - despite the fact that they only connect at 12Mb (usb1.1). This
is the case for two of my older webcams - a Targus and a Creative Live! cam both only connect at 1.1 speeds.

USB 3.0
Although Linux does have support for usb3 cards there is a bug in the current Ubuntu 'Natty Narwhal' kernel that means that USB 3.0 hubs may only be
recognised as USB 2.0 hubs - you can see them using 

lusub -t

connecting at 480M (usb 2.0).
This post suggested
that a later version of the kernel would recognise the usb 3.0 hub properly. 
I re-installed with the latest alpha version 11.10 (Oneiric Ocelot) which includes a later kernel. It now recognises the hub as 5000M.

Webcam USB Bandwidth
Some research on webcam USB bandwidth turned up a useful trick. Webcams request a whole load of bandwidth, usually more than they need. 
Symptoms were fairly easy to spot: Opening one camera with 

xawtv -v 1 -c /dev/video0

and at the same time opening /dev/video1 in another terminal led to 

libv4l2: error turning on stream: No space left on device
VIDIOC_STREAMON - Unable to start capture: No space left on device
fps is set to 1/30
libv4l2: error turning on stream: Device or resource busy
VIDIOC_STREAMON - Unable to start capture: Device or resource busy

This post and this post gave me some useful pointers. The uvcvideo kernel module can be set to ignore the requested bandwidth, and to calculate the right bandwidth.
Try:

sudo rmmod uvcvideo
sudo modprobe uvcvideo quirks=128

This will be reset every reboot. If this works, create the following file: 

sudo vi /etc/modprobe.d/uvcvideo.conf

containing the line:

options uvcvideo quirks=128

My Hardware setup
My new hardware - in case anyone wants to follow in my footsteps:
Transcend PCI Express Interface USB 3.0 Dual Expansion Card
Tsunami SSU34 100mm USB 3.0 4 Ports Hub
Webcam with Microphone for XP Vista PC Laptop MSN Skype

Output from lsusb :

davidr@hgwells:~$ lsusb -t

/: Bus 04.Port 1: Dev 1, Class=root_hub, Driver=xhci_hcd/2p, 5000M
|__ Port 2: Dev 2, If 0, Class=hub, Driver=hub/4p, 5000M
/: Bus 03.Port 1: Dev 1, Class=root_hub, Driver=xhci_hcd/2p, 480M
|__ Port 2: Dev 2, If 0, Class=hub, Driver=hub/4p, 480M
|__ Port 1: Dev 3, If 0, Class='bInterfaceClass 0x0e not yet handled', Driver=uvcvideo, 480M
|__ Port 1: Dev 3, If 1, Class='bInterfaceClass 0x0e not yet handled', Driver=uvcvideo, 480M
|__ Port 2: Dev 4, If 0, Class='bInterfaceClass 0x0e not yet handled', Driver=uvcvideo, 480M
|__ Port 2: Dev 4, If 1, Class='bInterfaceClass 0x0e not yet handled', Driver=uvcvideo, 480M
|__ Port 3: Dev 5, If 0, Class='bInterfaceClass 0x0e not yet handled', Driver=uvcvideo, 480M
|__ Port 3: Dev 5, If 1, Class='bInterfaceClass 0x0e not yet handled', Driver=uvcvideo, 480M
|__ Port 4: Dev 6, If 0, Class='bInterfaceClass 0x0e not yet handled', Driver=uvcvideo, 480M
|__ Port 4: Dev 6, If 1, Class='bInterfaceClass 0x0e not yet handled', Driver=uvcvideo, 480M
/: Bus 02.Port 1: Dev 1, Class=root_hub, Driver=ohci_hcd/8p, 12M
/: Bus 01.Port 1: Dev 1, Class=root_hub, Driver=ehci_hcd/8p, 480M
|__ Port 1: Dev 2, If 0, Class=hub, Driver=hub/4p, 480M
|__ Port 4: Dev 3, If 0, Class=hub, Driver=hub/4p, 12M
|__ Port 1: Dev 4, If 0, Class=HID, Driver=usbhid, 12M
|__ Port 1: Dev 4, If 1, Class=HID, Driver=usbhid, 12M
|__ Port 4: Dev 5, If 0, Class=hub, Driver=hub/4p, 12M
|__ Port 2: Dev 6, If 0, Class=HID, Driver=usbhid, 12M
|__ Port 2: Dev 6, If 1, Class=HID, Driver=usbhid, 12M
|__ Port 3: Dev 7, If 0, Class=HID, Driver=wacom, 1.5M

davidr@hgwells:~$ lsusb

Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
Bus 002 Device 001: ID 1d6b:0001 Linux Foundation 1.1 root hub
Bus 003 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
Bus 004 Device 001: ID 1d6b:0003 Linux Foundation 3.0 root hub
Bus 001 Device 002: ID 05e3:0608 Genesys Logic, Inc. USB-2.0 4-Port HUB
Bus 003 Device 002: ID 2109:3431
Bus 004 Device 002: ID 2109:0810
Bus 001 Device 003: ID 05e3:0604 Genesys Logic, Inc. USB 1.1 Hub
Bus 003 Device 003: ID 090c:937b Feiya Technology Corp. Silicon Motion Camera
Bus 003 Device 004: ID 090c:937b Feiya Technology Corp. Silicon Motion Camera
Bus 003 Device 005: ID 090c:937b Feiya Technology Corp. Silicon Motion Camera
Bus 003 Device 006: ID 090c:937b Feiya Technology Corp. Silicon Motion Camera
Bus 001 Device 004: ID 046d:c049 Logitech, Inc. G5 Laser Mouse
Bus 001 Device 005: ID 05f3:0081 PI Engineering, Inc. Kinesis Integrated Hub
Bus 001 Device 006: ID 05f3:0007 PI Engineering, Inc. Kinesis Advantage PRO MPC/USB Keyboard
Bus 001 Device 007: ID 056a:0013 Wacom Co., Ltd Graphire 3 4x5