Friday, October 22, 2010

momentary contact switch via an opto relay

We need to interface to another piece of equipment, which expects a momentary contact switch input.

I chose a Panasonic AQY212EH PhotoMos for this purpose. It's an optically isolated relay in a 4-pin DIP package.

I simply connected a BeagleBoard GPIO output to pin 1 through a 130 ohm resistor; and grounded pin 2. Then pins 3 and 4 can simulate a pushbutton. i.e., when the BeagleBoard output is driven high we have a closed circuit on pins 3-4 (about 1 ohm resistance); and when the BeagleBoard output is driven low, we've got an open circuit.

Simple, cheap, and it optically isolates the BeagleBoard from the external equipment.

I2C digital potentiometer

We need to control a valve from the BeagleBoard, which requires a 1-5V DC signal to actuate the valve from fully open to fully closed linearly.

I chose a digital potentiometer for this - the Maxim DS1803. The nice thing about this part is:
1) It's a DIP
2) It can be controlled via I2C
3) It can handle 5V across the resistor, perfect for our application.

Unfortunately this part will require a level translator, because a logic high is 0.7*Vcc = 3.5V. (We need Vcc to be 5V, since we'll be putting 5V across the resistor).

I couldn't find any DIP IC's for 1.8V <-> 5V level translation, and don't particularly want to hand solder surface mount parts, so I ordered a pre-fabbed level converter, the I2C-TRN, which uses a PCA9306 level shifter:

http://store.gravitech.us/dubii2cvotr.html

I found some on eBay for $13.50 in stock ready to ship.

I 've also prepared by soldered up a socket on a breadboard for the DS1803, and rebuilt the Ubuntu kernel so that the BeagleBoard should be ready to talk I2C on the expansion header pins 23 and 24.

enabling I2C on expansion header

I'd like to communicate with an I2C digital potentiometer (Maxim DS1803), using the I2C bus on the expansion header (pins 23 and 24). However, the only i2c busses that show up are 1 and 3, while the expansion header bus should be 2:

$ i2cdetect -l
i2c-1 unknown OMAP I2C adapter N/A
i2c-3 unknown OMAP I2C adapter N/A


I made the following change to the kernel to enable i2c-2:

1) in .config, set CONFIG_OMAP_MUX=y

2) in arch/arm/mach-omap2/board-omap3beagle.c, make these changes:

a) in omap3_beagle_i2c_init(), add:
omap_register_i2c_bus(2, 400, NULL, 0);

b) in board_mux[], add:
static struct omap_board_mux board_mux[] __initdata = {
OMAP3_MUX(I2C2_SCL, OMAP_MUX_MODE0),
OMAP3_MUX(I2C2_SDA, OMAP_MUX_MODE0),
{ .reg_offset = OMAP_MUX_TERMINATOR },
};

Now rebuild the kernel, copy it to the SD card, and reboot; and now we can see the bus:

$ i2cdetect -l
i2c-1 unknown OMAP I2C adapter N/A
i2c-3 unknown OMAP I2C adapter N/A
i2c-2 unknown OMAP I2C adapter N/A

$ sudo i2cdetect -F 2
Functionalities implemented by /dev/i2c-2:
I2C yes
SMBus Quick Command no
SMBus Send Byte yes
SMBus Receive Byte yes
SMBus Write Byte yes
SMBus Read Byte yes
SMBus Write Word yes
SMBus Read Word yes
SMBus Process Call yes
SMBus Block Write yes
SMBus Block Read no
SMBus Block Process Call no
SMBus PEC yes
I2C Block Write yes
I2C Block Read yes

And nowwe should be able to scan the bus - with the DS1803 on the bus we see:

sudo i2cdetect -y -r 2
0 1 2 3 4 5 6 7 8 9 a b c d e f
00: -- -- -- -- -- -- -- -- -- -- -- -- --
10: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
20: -- -- -- -- -- -- -- -- 28 -- -- -- -- -- -- --
30: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
40: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
50: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
60: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
70: -- -- -- -- -- -- -- --

Wednesday, October 20, 2010

new camera

I chose a USB 400X digital microscope instead of a standard webcam for the new camera:

http://www.dealextreme.com/details.dx/sku.41844~r.27613104

I saw some sites refer to this as the "Oasis UMO19 MCU003". This is a US2.0 device and also supports multiple Isochronous streaming video endpoints, AND is a UVC device:
http://randomprojects.org/wiki/Oasis_UMO19_MCU003_USB_microscope

Here's someone's evaluation of this camera:
http://www.stealthcopter.com/blog/2010/09/photos-with-my-new-usb-microscope-20x-400x-1-3mp-digital-microscope/

In order to sample from both simultaneously, I had to enable the quirks module option - I made this happen automatically at boot time by adding a file called /etc/modprobe.d/uvcvideo.conf with the following line:
options uvcvideo quirks=0x80

Also, I couldn't stream from both cameras simultaneously at 640x480 30 frames/sec - I had to drop the frame size down to 352x288 in order to avoid the "Unable to start capture: No space left on device"

One other note - by default, this camera would automatically throttle the framerate depending on the lighting. For example, in dark lighting I'd only get about 6 frames/sec.

I toggled the "Exposure, Auto Priority" switch in GUVCVideo, and it turned off this "feature". And, it looks to be persistent - even after unplugging/rebooting, the camera still now does about 30 frames/sec regardless of lighting.

For reference, here's some more info about this camera:
$ udevadm info -q all -n /dev/video0
P: /devices/platform/ehci-omap.0/usb1/1-2/1-2.5/1-2.5:1.0/video4linux/video0
N: video0
S: char/81:0
S: v4l/by-id/usb-Vimicro_Co._ltd_Vimicro_USB2.0_UVC_PC_Camera-video-index0
S: v4l/by-path/platform-ehci-omap.0-usb-0:2.5:1.0-video-index0
E: UDEV_LOG=3
E: DEVPATH=/devices/platform/ehci-omap.0/usb1/1-2/1-2.5/1-2.5:1.0/video4linux/video0
E: MAJOR=81
E: MINOR=0
E: DEVNAME=/dev/video0
E: SUBSYSTEM=video4linux
E: ID_V4L_VERSION=2
E: ID_V4L_PRODUCT=Vimicro USB2.0 UVC PC Camera
E: ID_V4L_CAPABILITIES=:capture:
E: ID_VENDOR=Vimicro_Co._ltd
E: ID_VENDOR_ENC=Vimicro\x20Co.\x2cltd
E: ID_VENDOR_ID=0ac8
E: ID_MODEL=Vimicro_USB2.0_UVC_PC_Camera
E: ID_MODEL_ENC=Vimicro\x20USB2.0\x20UVC\x20PC\x20Camera
E: ID_MODEL_ID=3610
E: ID_REVISION=0100
E: ID_SERIAL=Vimicro_Co._ltd_Vimicro_USB2.0_UVC_PC_Camera
E: ID_TYPE=video
E: ID_BUS=usb
E: ID_USB_INTERFACES=:0e0100:0e0200:
E: ID_USB_INTERFACE_NUM=00
E: ID_USB_DRIVER=uvcvideo
E: ID_PATH=platform-ehci-omap.0-usb-0:2.5:1.0
E: ACL_MANAGE=1
E: DEVLINKS=/dev/char/81:0 /dev/v4l/by-id/usb-Vimicro_Co._ltd_Vimicro_USB2.0_UVC_PC_Camera-video-index0 /dev/v4l/by-path/platform-ehci-omap.0-usb-0:2.5:1.0-video-index0


Tuesday, October 19, 2010

dual camera support

My application requires using 2 cameras simultaneously. However, when attempting to call uvcGrab after opening both devices, one of the devices would fail with:

"Unable to start capture: No space left on device"

I found this thread which was helpful - it turns out to be a USB bandwith issue:

http://www.mail-archive.com/linux-uvc-devel@lists.berlios.de/msg03820.html

Unfortunately, the camera I chose has only 1 single Isochronous Video Streaming interface with wMaxPacketSize of 3x1000 bytes as shown below. So even attempting to force the driver to load with the UVC_QUIRK_FIX_BANDWIDTH flag (sudo insmod drivers/media/video/uvc/uvcvideo.ko trace=0x7ff quirks=0x80) wouldn't allow both cameras to run simultaneously, even with 160x120 frames at 15FPS!

I need to find a new camera.


lsusb -v
Bus 001 Device 008: ID 18ec:3299 Arkmicro Technologies Inc.
Device Descriptor:
bLength 18
bDescriptorType 1
bcdUSB 2.00
bDeviceClass 239 Miscellaneous Device
bDeviceSubClass 2 ?
bDeviceProtocol 1 Interface Association
bMaxPacketSize0 64
idVendor 0x18ec Arkmicro Technologies Inc.
idProduct 0x3299
bcdDevice 1.00
iManufacturer 1
iProduct 2
iSerial 0
bNumConfigurations 1
Configuration Descriptor:
bLength 9
bDescriptorType 2
wTotalLength 498
bNumInterfaces 4
bConfigurationValue 1
iConfiguration 0
bmAttributes 0x80
(Bus Powered)
MaxPower 320mA
Interface Association:
bLength 8
bDescriptorType 11
bFirstInterface 0
bInterfaceCount 2
bFunctionClass 14 Video
bFunctionSubClass 3 Video Interface Collection
bFunctionProtocol 0
iFunction 0
Interface Descriptor:
bLength 9
bDescriptorType 4
bInterfaceNumber 0
bAlternateSetting 0
bNumEndpoints 1
bInterfaceClass 14 Video
bInterfaceSubClass 1 Video Control
bInterfaceProtocol 0
iInterface 0
VideoControl Interface Descriptor:
bLength 13
bDescriptorType 36
bDescriptorSubtype 1 (HEADER)
bcdUVC 1.00
wTotalLength 51
dwClockFrequency 24.000000MHz
bInCollection 1
baInterfaceNr( 0) 1
VideoControl Interface Descriptor:
bLength 18
bDescriptorType 36
bDescriptorSubtype 2 (INPUT_TERMINAL)
bTerminalID 1
wTerminalType 0x0201 Camera Sensor
bAssocTerminal 0
iTerminal 0
wObjectiveFocalLengthMin 0
wObjectiveFocalLengthMax 0
wOcularFocalLength 0
bControlSize 3
bmControls 0x0000200a
Auto-Exposure Mode
Exposure Time (Absolute)
Roll (Absolute)
VideoControl Interface Descriptor:
bLength 11
bDescriptorType 36
bDescriptorSubtype 5 (PROCESSING_UNIT)
Warning: Descriptor too short
bUnitID 2
bSourceID 1
wMaxMultiplier 0
bControlSize 2
bmControls 0x0000073f
Brightness
Contrast
Hue
Saturation
Sharpness
Gamma
Backlight Compensation
Gain
Power Line Frequency
iProcessing 0
bmVideoStandards 0x 9
None
SECAM - 625/50
VideoControl Interface Descriptor:
bLength 9
bDescriptorType 36
bDescriptorSubtype 3 (OUTPUT_TERMINAL)
bTerminalID 3
wTerminalType 0x0101 USB Streaming
bAssocTerminal 0
bSourceID 2
iTerminal 0
Endpoint Descriptor:
bLength 7
bDescriptorType 5
bEndpointAddress 0x81 EP 1 IN
bmAttributes 3
Transfer Type Interrupt
Synch Type None
Usage Type Data
wMaxPacketSize 0x0010 1x 16 bytes
bInterval 10
Interface Descriptor:
bLength 9
bDescriptorType 4
bInterfaceNumber 1
bAlternateSetting 0
bNumEndpoints 0
bInterfaceClass 14 Video
bInterfaceSubClass 2 Video Streaming
bInterfaceProtocol 0
iInterface 0
VideoStreaming Interface Descriptor:
bLength 14
bDescriptorType 36
bDescriptorSubtype 1 (INPUT_HEADER)
bNumFormats 1
wTotalLength 275
bEndPointAddress 131
bmInfo 0
bTerminalLink 3
bStillCaptureMethod 2
bTriggerSupport 1
bTriggerUsage 0
bControlSize 1
bmaControls( 0) 27
VideoStreaming Interface Descriptor:
bLength 27
bDescriptorType 36
bDescriptorSubtype 4 (FORMAT_UNCOMPRESSED)
bFormatIndex 1
bNumFrameDescriptors 5
guidFormat {59555932-0000-1000-8000-00aa00389b71}
bBitsPerPixel 16
bDefaultFrameIndex 1
bAspectRatioX 0
bAspectRatioY 0
bmInterlaceFlags 0x00
Interlaced stream or variable: No
Fields per frame: 1 fields
Field 1 first: No
Field pattern: Field 1 only
bCopyProtect 0
VideoStreaming Interface Descriptor:
bLength 42
bDescriptorType 36
bDescriptorSubtype 5 (FRAME_UNCOMPRESSED)
bFrameIndex 1
bmCapabilities 0x00
Still image unsupported
wWidth 640
wHeight 480
dwMinBitRate 614400
dwMaxBitRate 18432000
dwMaxVideoFrameBufferSize 614400
dwDefaultFrameInterval 333333
bFrameIntervalType 4
dwFrameInterval( 0) 333333
dwFrameInterval( 1) 666666
dwFrameInterval( 2) 1000000
dwFrameInterval( 3) 2000000
VideoStreaming Interface Descriptor:
bLength 42
bDescriptorType 36
bDescriptorSubtype 5 (FRAME_UNCOMPRESSED)
bFrameIndex 2
bmCapabilities 0x00
Still image unsupported
wWidth 352
wHeight 288
dwMinBitRate 202752
dwMaxBitRate 6082560
dwMaxVideoFrameBufferSize 202752
dwDefaultFrameInterval 333333
bFrameIntervalType 4
dwFrameInterval( 0) 333333
dwFrameInterval( 1) 666666
dwFrameInterval( 2) 1000000
dwFrameInterval( 3) 2000000
VideoStreaming Interface Descriptor:
bLength 42
bDescriptorType 36
bDescriptorSubtype 5 (FRAME_UNCOMPRESSED)
bFrameIndex 3
bmCapabilities 0x00
Still image unsupported
wWidth 320
wHeight 240
dwMinBitRate 153600
dwMaxBitRate 4608000
dwMaxVideoFrameBufferSize 153600
dwDefaultFrameInterval 333333
bFrameIntervalType 4
dwFrameInterval( 0) 333333
dwFrameInterval( 1) 666666
dwFrameInterval( 2) 1000000
dwFrameInterval( 3) 2000000
VideoStreaming Interface Descriptor:
bLength 42
bDescriptorType 36
bDescriptorSubtype 5 (FRAME_UNCOMPRESSED)
bFrameIndex 4
bmCapabilities 0x00
Still image unsupported
wWidth 176
wHeight 144
dwMinBitRate 50688
dwMaxBitRate 1520640
dwMaxVideoFrameBufferSize 50688
dwDefaultFrameInterval 333333
bFrameIntervalType 4
dwFrameInterval( 0) 333333
dwFrameInterval( 1) 666666
dwFrameInterval( 2) 1000000
dwFrameInterval( 3) 2000000
VideoStreaming Interface Descriptor:
bLength 42
bDescriptorType 36
bDescriptorSubtype 5 (FRAME_UNCOMPRESSED)
bFrameIndex 5
bmCapabilities 0x00
Still image unsupported
wWidth 160
wHeight 120
dwMinBitRate 38400
dwMaxBitRate 1152000
dwMaxVideoFrameBufferSize 38400
dwDefaultFrameInterval 333333
bFrameIntervalType 4
dwFrameInterval( 0) 333333
dwFrameInterval( 1) 666666
dwFrameInterval( 2) 1000000
dwFrameInterval( 3) 2000000
VideoStreaming Interface Descriptor:
bLength 18
bDescriptorType 36
bDescriptorSubtype 3 (STILL_IMAGE_FRAME)
bEndpointAddress 0
bNumImageSizePatterns 3
wWidth( 0) 640
wHeight( 0) 480
wWidth( 1) 800
wHeight( 1) 600
wWidth( 2) 1280
wHeight( 2) 1024
bNumCompressionPatterns 3
VideoStreaming Interface Descriptor:
bLength 6
bDescriptorType 36
bDescriptorSubtype 13 (COLORFORMAT)
bColorPrimaries 0 (Unspecified)
bTransferCharacteristics 0 (Unspecified)
bMatrixCoefficients 0 (Unspecified)
Interface Descriptor:
bLength 9
bDescriptorType 4
bInterfaceNumber 1
bAlternateSetting 1
bNumEndpoints 1
bInterfaceClass 14 Video
bInterfaceSubClass 2 Video Streaming
bInterfaceProtocol 0
iInterface 0
Endpoint Descriptor:
bLength 7
bDescriptorType 5
bEndpointAddress 0x83 EP 3 IN
bmAttributes 5
Transfer Type Isochronous
Synch Type Asynchronous
Usage Type Data
wMaxPacketSize 0x13e8 3x 1000 bytes
bInterval 1
Interface Association:
bLength 8
bDescriptorType 11
bFirstInterface 2
bInterfaceCount 2
bFunctionClass 1 Audio
bFunctionSubClass 1 Control Device
bFunctionProtocol 0
iFunction 4
Interface Descriptor:
bLength 9
bDescriptorType 4
bInterfaceNumber 2
bAlternateSetting 0
bNumEndpoints 0
bInterfaceClass 1 Audio
bInterfaceSubClass 1 Control Device
bInterfaceProtocol 0
iInterface 4
AudioControl Interface Descriptor:
bLength 9
bDescriptorType 36
bDescriptorSubtype 1 (HEADER)
bcdADC 1.00
wTotalLength 40
bInCollection 1
baInterfaceNr( 0) 3
AudioControl Interface Descriptor:
bLength 12
bDescriptorType 36
bDescriptorSubtype 2 (INPUT_TERMINAL)
bTerminalID 1
wTerminalType 0x0201 Microphone
bAssocTerminal 0
bNrChannels 2
wChannelConfig 0x0003
Left Front (L)
Right Front (R)
iChannelNames 0
iTerminal 0
AudioControl Interface Descriptor:
bLength 10
bDescriptorType 36
bDescriptorSubtype 6 (FEATURE_UNIT)
bUnitID 2
bSourceID 1
bControlSize 1
bmaControls( 0) 0x00
bmaControls( 1) 0x03
Mute
Volume
bmaControls( 2) 0x03
Mute
Volume
iFeature 0
AudioControl Interface Descriptor:
bLength 9
bDescriptorType 36
bDescriptorSubtype 3 (OUTPUT_TERMINAL)
bTerminalID 3
wTerminalType 0x0101 USB Streaming
bAssocTerminal 0
bSourceID 2
iTerminal 0
Interface Descriptor:
bLength 9
bDescriptorType 4
bInterfaceNumber 3
bAlternateSetting 0
bNumEndpoints 0
bInterfaceClass 1 Audio
bInterfaceSubClass 2 Streaming
bInterfaceProtocol 0
iInterface 4
Interface Descriptor:
bLength 9
bDescriptorType 4
bInterfaceNumber 3
bAlternateSetting 1
bNumEndpoints 1
bInterfaceClass 1 Audio
bInterfaceSubClass 2 Streaming
bInterfaceProtocol 0
iInterface 4
AudioStreaming Interface Descriptor:
bLength 7
bDescriptorType 36
bDescriptorSubtype 1 (AS_GENERAL)
bTerminalLink 3
bDelay 1 frames
wFormatTag 1 PCM
AudioStreaming Interface Descriptor:
bLength 11
bDescriptorType 36
bDescriptorSubtype 2 (FORMAT_TYPE)
bFormatType 1 (FORMAT_TYPE_I)
bNrChannels 1
bSubframeSize 2
bBitResolution 16
bSamFreqType 1 Discrete
tSamFreq[ 0] 48000
Endpoint Descriptor:
bLength 9
bDescriptorType 5
bEndpointAddress 0x82 EP 2 IN
bmAttributes 1
Transfer Type Isochronous
Synch Type None
Usage Type Data
wMaxPacketSize 0x0080 1x 128 bytes
bInterval 4
bRefresh 0
bSynchAddress 0
AudioControl Endpoint Descriptor:
bLength 7
bDescriptorType 37
bDescriptorSubtype 1 (EP_GENERAL)
bmAttributes 0x01
Sampling Frequency
bLockDelayUnits 0 Undefined
wLockDelay 0 Undefined