<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
	<id>http://wikilegacy.armadeus.com/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=OlivierR</id>
	<title>ArmadeusWiki - User contributions [en]</title>
	<link rel="self" type="application/atom+xml" href="http://wikilegacy.armadeus.com/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=OlivierR"/>
	<link rel="alternate" type="text/html" href="http://wikilegacy.armadeus.com/index.php?title=Special:Contributions/OlivierR"/>
	<updated>2026-04-29T01:41:49Z</updated>
	<subtitle>User contributions</subtitle>
	<generator>MediaWiki 1.43.6</generator>
	<entry>
		<id>http://wikilegacy.armadeus.com/index.php?title=Xenomai&amp;diff=9402</id>
		<title>Xenomai</title>
		<link rel="alternate" type="text/html" href="http://wikilegacy.armadeus.com/index.php?title=Xenomai&amp;diff=9402"/>
		<updated>2011-02-17T12:46:25Z</updated>

		<summary type="html">&lt;p&gt;OlivierR: /* Links */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==What is Xenomai ?==&lt;br /&gt;
&lt;br /&gt;
Xenomai is a real time co-kernel which cooperate with Linux via Adeos. With its help hard real time applications can be developped and run on the Armadeus boards.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Thanks to Adeos, Xenomai will receive the interrupts first and decide&lt;br /&gt;
to handle them or not. If not, they will then be transfered to the regular&lt;br /&gt;
Linux kernel. Also, Xenomai provides a framework to develop applications which&lt;br /&gt;
can be easily moved between the Real Time Xenomai environment and the regular&lt;br /&gt;
Linux system. Moreover, Xeno provides a set of APIs (called &amp;quot;skins&amp;quot;) that&lt;br /&gt;
emulate traditional RTOSes such as VxWorks and pSOS and implement other APIs&lt;br /&gt;
such as POSIX. Thus, porting third party real time applications to Xenomai is&lt;br /&gt;
a fairly simple process.&lt;br /&gt;
&lt;br /&gt;
==Explanation of the process used to install Xenomai==&lt;br /&gt;
&lt;br /&gt;
The main steps are:&lt;br /&gt;
* selection of Xenomai package on the Buildroot menuconfig,&lt;br /&gt;
* selection of Xenomai features in Kernel menuconfig,&lt;br /&gt;
* compilation of the new version,&lt;br /&gt;
* validation of the Xenomai behaviour.&lt;br /&gt;
&lt;br /&gt;
===Selecting Xenomai package===&lt;br /&gt;
&lt;br /&gt;
* First of all, you need to select Xenomai package in Buildroot menuconfig:&lt;br /&gt;
&amp;lt;pre class=&amp;quot;host&amp;quot;&amp;gt;&lt;br /&gt;
 $ make menuconfig&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;pre class=&amp;quot;config&amp;quot;&amp;gt;&lt;br /&gt;
Package Selection for the target ---&amp;gt;&lt;br /&gt;
    Hardware handling / blockdevices and filesystem maintenance  ---&amp;gt;&lt;br /&gt;
        ....&lt;br /&gt;
        [*] Xenomai&lt;br /&gt;
        ....&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* Exit and save your configuration&lt;br /&gt;
* If you plan to use &#039;&#039;xeno-test&#039;&#039; (Xenomai performance tool) then CONFIG_ASH_GETOPTS should be activated in Busybox:&lt;br /&gt;
&amp;lt;pre class=&amp;quot;host&amp;quot;&amp;gt;&lt;br /&gt;
 $ make busybox-menuconfig&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;pre class=&amp;quot;config&amp;quot;&amp;gt;&lt;br /&gt;
Shells  ---&amp;gt;&lt;br /&gt;
        Choose your default shell (ash)  ---&amp;gt;&lt;br /&gt;
    --- ash&lt;br /&gt;
    ---   Ash Shell Options&lt;br /&gt;
          ...&lt;br /&gt;
          [*]   Builtin getopt to parse positional parameters &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* Exit and save your configuration&lt;br /&gt;
* rebuild Busybox:&lt;br /&gt;
&amp;lt;pre class=&amp;quot;host&amp;quot;&amp;gt;&lt;br /&gt;
$ make busybox-clean &amp;amp;&amp;amp; make&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Xenomai kernel space support===&lt;br /&gt;
*At first time, to have Linux kernel patched with Xenomai and Adeos patches, you must type:&lt;br /&gt;
&amp;lt;pre class=&amp;quot;host&amp;quot;&amp;gt;&lt;br /&gt;
 $ make&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
*Then you can configure the Xenomai kernel options from Linux menuconfig:&lt;br /&gt;
&amp;lt;pre class=&amp;quot;host&amp;quot;&amp;gt;&lt;br /&gt;
 $ make linux26-menuconfig&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
You should see the new entry :&lt;br /&gt;
&amp;lt;pre class=&amp;quot;config&amp;quot;&amp;gt;&lt;br /&gt;
 Real-time sub-system  ---&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Enter in it and check the following to compile Xenomai as a part of the Linux kernel :&lt;br /&gt;
&amp;lt;pre class=&amp;quot;config&amp;quot;&amp;gt;&lt;br /&gt;
 [*] Xenomai&lt;br /&gt;
   &amp;lt;*&amp;gt; Nucleus &lt;br /&gt;
   [*]   Pervasive real-time support in user-space&lt;br /&gt;
   [ ]     Interrupt shield support&lt;br /&gt;
   [*]     Priority coupling support&lt;br /&gt;
   [*]   Optimize as pipeline head&lt;br /&gt;
   (32)  Number of pipe devices&lt;br /&gt;
   (512) Number of registry slots&lt;br /&gt;
   (128) Size of the system heap (Kb)&lt;br /&gt;
   (32)  Size of the private stack pool (Kb)&lt;br /&gt;
   [*]   Statistics collection&lt;br /&gt;
   [ ]   Debug support&lt;br /&gt;
   [ ]   Shared interrupts&lt;br /&gt;
      Timing  ---&amp;gt;&lt;br /&gt;
      Scalability  ---&amp;gt;&lt;br /&gt;
      Machine  ---&amp;gt;&lt;br /&gt;
      Interfaces  ---&amp;gt;&lt;br /&gt;
      Drivers  ---&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Additionaly, to enable / disable the different available skins, go into &amp;lt;b&amp;gt;&#039;&#039;Interfaces  ---&amp;gt;&#039;&#039;&amp;lt;/b&amp;gt; :&lt;br /&gt;
&amp;lt;pre class=&amp;quot;config&amp;quot;&amp;gt;&lt;br /&gt;
 &amp;lt;*&amp;gt; Native API  ---&amp;gt;&lt;br /&gt;
 &amp;lt;*&amp;gt; POSIX API  ---&amp;gt;&lt;br /&gt;
 &amp;lt; &amp;gt; pSOS+ emulator  ---&amp;gt;&lt;br /&gt;
 &amp;lt; &amp;gt; uITRON API  ---&amp;gt;&lt;br /&gt;
 &amp;lt; &amp;gt; VRTX emulator  ---&amp;gt;&lt;br /&gt;
 &amp;lt; &amp;gt; VxWorks emulator  ---&amp;gt;&lt;br /&gt;
 &amp;lt; &amp;gt; RTAI emulator  ---&amp;gt;&lt;br /&gt;
 &amp;lt;*&amp;gt; Real-Time Driver Model  ---&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Finally, compile everything:&lt;br /&gt;
&amp;lt;pre class=&amp;quot;host&amp;quot;&amp;gt;&lt;br /&gt;
 $ make linux26 &amp;amp;&amp;amp; make&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Deploy==&lt;br /&gt;
&lt;br /&gt;
You can now [[Target_Software_Installation | transfer]] the rootfs and the kernel&lt;br /&gt;
on the APF.&lt;br /&gt;
&lt;br /&gt;
==Validate the installation==&lt;br /&gt;
&lt;br /&gt;
* Boot the APF and logon as root.&lt;br /&gt;
* You can double check Xenomai is installed correctly:&lt;br /&gt;
&amp;lt;pre class=&amp;quot;apf&amp;quot;&amp;gt;&lt;br /&gt;
 $ dmesg | grep Xenomai&lt;br /&gt;
  I-pipe: Domain Xenomai registered.&lt;br /&gt;
  Xenomai: hal/arm started.&lt;br /&gt;
  Xenomai: real-time nucleus v2.4.3 (Back to Shalla-Bal) loaded.&lt;br /&gt;
  Xenomai: starting native API services.&lt;br /&gt;
  Xenomai: starting POSIX services.&lt;br /&gt;
  Xenomai: starting RTDM services.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* Now we can run the performance test provided by Xenomai:&lt;br /&gt;
&amp;lt;pre class=&amp;quot;apf&amp;quot;&amp;gt;&lt;br /&gt;
 $ xeno-test&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Deinstalling or disabling Xenomai==&lt;br /&gt;
There are two parts needed for disabling Xenomai features&lt;br /&gt;
&lt;br /&gt;
===Kernel===&lt;br /&gt;
For disabling kernel part, two solutions are available&lt;br /&gt;
&lt;br /&gt;
* The first solution is to unselect kernel&#039;s features :&lt;br /&gt;
&amp;lt;pre class=&amp;quot;host&amp;quot;&amp;gt;&lt;br /&gt;
 $ make linux26-menuconfig&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
And disable following options:&lt;br /&gt;
&amp;lt;pre class=&amp;quot;config&amp;quot;&amp;gt;&lt;br /&gt;
Real-time sub-system ---&amp;gt;&lt;br /&gt;
    [ ] Xenomai&lt;br /&gt;
&lt;br /&gt;
and&lt;br /&gt;
&lt;br /&gt;
Kernel Features ---&amp;gt; &lt;br /&gt;
    [ ] Interrupt pipeline&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* The second solution is to destroy the kernel tree :&lt;br /&gt;
&amp;lt;pre class=&amp;quot;host&amp;quot;&amp;gt;&lt;br /&gt;
 $ make linux26-dirclean&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Userspace / package===&lt;br /&gt;
For disabling userspace/package part :&lt;br /&gt;
&amp;lt;pre class=&amp;quot;host&amp;quot;&amp;gt;&lt;br /&gt;
 $ make menuconfig&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
and disable Xenomai&lt;br /&gt;
&amp;lt;pre class=&amp;quot;config&amp;quot;&amp;gt;&lt;br /&gt;
Package Selection for the target ---&amp;gt; &lt;br /&gt;
    [ ] Xenomai&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
then use the dirclean command:&lt;br /&gt;
&amp;lt;pre class=&amp;quot;host&amp;quot;&amp;gt;&lt;br /&gt;
 $ make xenomai-dirclean&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Going further==&lt;br /&gt;
* [[Xenomai:examples usage | Using Armadeus Xenomai custom examples]]&lt;br /&gt;
* [[Xenomai:Blinking LEDs | Xenomai tutorial (blinking LED)]]&lt;br /&gt;
&lt;br /&gt;
==Links==&lt;br /&gt;
* [http://home.gna.org/adeos/ Adeos website]&lt;br /&gt;
* [http://www.xenomai.org Xenomai website]&lt;br /&gt;
* [[Adeos | Adeos installation]]&lt;br /&gt;
* [[Xenomai manual installation]] (for reference)&lt;br /&gt;
&lt;br /&gt;
[[Category:Software]]&lt;br /&gt;
[[Category:Real-Time]]&lt;/div&gt;</summary>
		<author><name>OlivierR</name></author>
	</entry>
	<entry>
		<id>http://wikilegacy.armadeus.com/index.php?title=User:OlivierR&amp;diff=8415</id>
		<title>User:OlivierR</title>
		<link rel="alternate" type="text/html" href="http://wikilegacy.armadeus.com/index.php?title=User:OlivierR&amp;diff=8415"/>
		<updated>2010-07-15T19:30:52Z</updated>

		<summary type="html">&lt;p&gt;OlivierR: /* Contributions : */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Bonjour,&lt;br /&gt;
Je suis enseignant-chercheur à l&#039;ENSIETA et je souhaite porter Armadeus dans le cursus d&#039;enseignement. &lt;br /&gt;
&lt;br /&gt;
== &#039;&#039;&#039;Mes compétences :&#039;&#039;&#039; ==&lt;br /&gt;
* Robotique&lt;br /&gt;
* Méthodes ensemblistes et calcul par intervalles&lt;br /&gt;
* Réseaux / Télécommuncations &lt;br /&gt;
* programmation en C/C++/Java/Python/Bash  &lt;br /&gt;
* GNU Linux Debian&lt;br /&gt;
&lt;br /&gt;
== &#039;&#039;&#039;Contributions :&#039;&#039;&#039; ==&lt;br /&gt;
* package Java pour faciliter la programmation Armadeus en Java et notamment l&#039;utilisation des périphériques&lt;br /&gt;
* [[URG_laser|to use an URG laser with APF27dev]]&lt;/div&gt;</summary>
		<author><name>OlivierR</name></author>
	</entry>
	<entry>
		<id>http://wikilegacy.armadeus.com/index.php?title=URG_laser&amp;diff=8414</id>
		<title>URG laser</title>
		<link rel="alternate" type="text/html" href="http://wikilegacy.armadeus.com/index.php?title=URG_laser&amp;diff=8414"/>
		<updated>2010-07-15T19:27:09Z</updated>

		<summary type="html">&lt;p&gt;OlivierR: /* Running */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;How to drive Hoyuko&#039;s URG series laser sensors.&lt;br /&gt;
&lt;br /&gt;
==Installation==&lt;br /&gt;
&amp;lt;pre class=&amp;quot;host&amp;quot;&amp;gt;&lt;br /&gt;
$ make menuconfig&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;pre class=&amp;quot;config&amp;quot;&amp;gt;&lt;br /&gt;
Package Selection for the target  ---&amp;gt;&lt;br /&gt;
    Hardware handling / blockdevices and filesystem maintenance  ---&amp;gt;&lt;br /&gt;
        [*]   urg library&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;pre class=&amp;quot;host&amp;quot;&amp;gt;&lt;br /&gt;
$ make&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* reflash rootfs&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Usage==&lt;br /&gt;
&lt;br /&gt;
To use Hokoyu URG laser, you need Prolific pl2303 USB to serial adapter ( [[USB_to_serial_adapter | see here to install pl2303]]).&lt;br /&gt;
&lt;br /&gt;
Load the module and connect the URG laser to APF27 dev USB port. You should see something like this :&lt;br /&gt;
&amp;lt;pre class=&amp;quot;apf&amp;quot;&amp;gt;&lt;br /&gt;
# modprobe pl2303&lt;br /&gt;
usbcore: registered new interface driver usbserial&lt;br /&gt;
usbserial: USB Serial Driver core&lt;br /&gt;
USB Serial support registered for pl2303&lt;br /&gt;
usbcore: registered new interface driver pl2303&lt;br /&gt;
pl2303: Prolific PL2303 USB to serial adaptor driver&lt;br /&gt;
# usb 2-1: new full speed USB device using mxc-ehci and address 3&lt;br /&gt;
usb 2-1: device descriptor read/64, error -71&lt;br /&gt;
usb 2-1: New USB device found, idVendor=15d1, idProduct=0000&lt;br /&gt;
usb 2-1: New USB device strings: Mfr=1, Product=2, SerialNumber=0&lt;br /&gt;
usb 2-1: Product: URG-Series USB Driver&lt;br /&gt;
usb 2-1: Manufacturer: Hokuyo Data Flex for USB&lt;br /&gt;
usb 2-1: configuration #1 chosen from 1 choice&lt;br /&gt;
cdc_acm 2-1:1.0: ttyACM0: USB ACM device&lt;br /&gt;
# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
The URG laser is known as the /dev/ttyACM0 serial device.&lt;br /&gt;
&lt;br /&gt;
==Code example==&lt;br /&gt;
With your favorite editor/IDE, create the following program:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;lt;iostream&amp;gt;&lt;br /&gt;
#include &amp;quot;UrgCtrl.h&amp;quot;&lt;br /&gt;
using namespace std;&lt;br /&gt;
using namespace qrk;&lt;br /&gt;
&lt;br /&gt;
int main() {&lt;br /&gt;
&lt;br /&gt;
	const char device[] = &amp;quot;/dev/ttyACM0&amp;quot;;&lt;br /&gt;
	UrgCtrl urg;&lt;br /&gt;
	if (! urg.connect(device)) {&lt;br /&gt;
		cout &amp;lt;&amp;lt; &amp;quot;UrgCtrl::connect: &amp;quot; &amp;lt;&amp;lt; urg.what() &amp;lt;&amp;lt; endl;&lt;br /&gt;
		exit(1);&lt;br /&gt;
	}&lt;br /&gt;
	vector&amp;lt;long&amp;gt; data;&lt;br /&gt;
	long timestamp = 0;&lt;br /&gt;
	while (1)&lt;br /&gt;
	{&lt;br /&gt;
		int n = urg.capture(data, &amp;amp;timestamp);&lt;br /&gt;
		if (n &amp;lt; 0) {&lt;br /&gt;
			cout &amp;lt;&amp;lt; &amp;quot;UrgCtrl::capture: &amp;quot; &amp;lt;&amp;lt; urg.what() &amp;lt;&amp;lt; endl;&lt;br /&gt;
			exit(1);&lt;br /&gt;
		}&lt;br /&gt;
		cout &amp;lt;&amp;lt; &amp;quot;timestamp: &amp;quot; &amp;lt;&amp;lt; timestamp &amp;lt;&amp;lt; &amp;quot;\t range at 0 degree : &amp;quot; &amp;lt;&amp;lt; data[n/2] &amp;lt;&amp;lt; &amp;quot; mm&amp;quot; &amp;lt;&amp;lt;endl;&lt;br /&gt;
	}&lt;br /&gt;
	return 0;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Save it as &#039;&#039;laser.cpp&#039;&#039;. &lt;br /&gt;
==Compilation==&lt;br /&gt;
You can put your program compilation and installation in a &#039;&#039;Makefile&#039;&#039; to make things cleaner:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
CXX=arm-linux-g++&lt;br /&gt;
EXEC=laser&lt;br /&gt;
SRC= $(wildcard *.cpp)&lt;br /&gt;
OBJ= $(SRC:.c=.o)&lt;br /&gt;
ARM_LIBS=$(ARMADEUS_STAGING_DIR)/usr/lib&lt;br /&gt;
URG_INCLUDE=$(ARMADEUS_STAGING_DIR)/usr/include/urg&lt;br /&gt;
LD_URG=-lurg_monitor -lurg -lurg_coordinate -lurg_geometry -lurg_connection -lurg_connection_sdl -lurg_common -lurg_system &lt;br /&gt;
SDL_INCLUDE=$(ARMADEUS_STAGING_DIR)/usr/include/SDL -D_GNU_SOURCE=1 -D_REENTRANT&lt;br /&gt;
LD_SDL=-lSDL &lt;br /&gt;
LD_PTHREAD=-lpthread&lt;br /&gt;
LDFLAGS= &lt;br /&gt;
CXXFLAGS=-g  -W -Wall  -DNO_DETECT_OS_H &lt;br /&gt;
&lt;br /&gt;
all: $(EXEC)&lt;br /&gt;
&lt;br /&gt;
laser: laser.cpp&lt;br /&gt;
	$(CXX) $(CXXFLAGS) -I$(URG_INCLUDE) -I$(SDL_INCLUDE) -o $@ $^ $(LDFLAGS)  -L$(ARM_LIBS)  $(LD_URG) $(LD_SDL) $(LD_PTHREAD)&lt;br /&gt;
&lt;br /&gt;
.PHONY: clean install&lt;br /&gt;
 &lt;br /&gt;
clean:&lt;br /&gt;
	rm -rf *.o&lt;br /&gt;
	rm -f $(EXEC)&lt;br /&gt;
 &lt;br /&gt;
install: all&lt;br /&gt;
	cp -f $(EXEC) /tftpboot/&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;!! If you do a cut &amp;amp; paste with previous commands, don&#039;t forget to check TABS for each target (Makefiles are using TABS and not SPACES) !! In that case make will complains about a missing separator line 11&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Then, on host, just do:&lt;br /&gt;
 [host ]$ make clean install&lt;br /&gt;
&lt;br /&gt;
==Running==&lt;br /&gt;
Copy your &#039;&#039;laser&#039;&#039; executable on your board through TFTP (for example) &lt;br /&gt;
&lt;br /&gt;
* Be sure to have TFTP server installed, [[Connection_with_U-Boot_on_Linux#TFTP_server| if not it&#039;s explained here]]. Copy &#039;&#039;laser&#039;&#039; to your TFTP directory:&lt;br /&gt;
&amp;lt;pre class=&amp;quot;host&amp;quot;&amp;gt;&lt;br /&gt;
 [demos]$ cp laser /tftpboot/&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* Load your executable on the target (here my host IP is 192.168.1.13):&lt;br /&gt;
&amp;lt;pre class=&amp;quot;apf&amp;quot;&amp;gt;&lt;br /&gt;
 # tftp -g -r laser  192.168.1.13&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* Give it executable rights, if lost during TFTP transfer:&lt;br /&gt;
&amp;lt;pre class=&amp;quot;apf&amp;quot;&amp;gt;&lt;br /&gt;
 # chmod a+x laser&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* Launch it:&lt;br /&gt;
&amp;lt;pre class=&amp;quot;apf&amp;quot;&amp;gt;&lt;br /&gt;
 # ./laser&lt;br /&gt;
timestamp: 624546        range at 0 degree : 1219 mm&lt;br /&gt;
timestamp: 624646        range at 0 degree : 1217 mm&lt;br /&gt;
timestamp: 624746        range at 0 degree : 1210 mm&lt;br /&gt;
timestamp: 624846        range at 0 degree : 1213 mm&lt;br /&gt;
timestamp: 624946        range at 0 degree : 1207 mm&lt;br /&gt;
timestamp: 625046        range at 0 degree : 1213 mm&lt;br /&gt;
timestamp: 625145        range at 0 degree : 1211 mm&lt;br /&gt;
timestamp: 625245        range at 0 degree : 1220 mm&lt;br /&gt;
timestamp: 625345        range at 0 degree : 1220 mm&lt;br /&gt;
timestamp: 625445        range at 0 degree : 1205 mm&lt;br /&gt;
timestamp: 625545        range at 0 degree : 1216 mm&lt;br /&gt;
timestamp: 625645        range at 0 degree : 1214 mm&lt;br /&gt;
timestamp: 625745        range at 0 degree : 1225 mm&lt;br /&gt;
timestamp: 625845        range at 0 degree : 1217 mm&lt;br /&gt;
timestamp: 625945        range at 0 degree : 1221 mm&lt;br /&gt;
 #&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Now it&#039;s up to you ! ;-)&lt;br /&gt;
&lt;br /&gt;
==Links==&lt;br /&gt;
* [http://www.hokuyo-aut.jp/02sensor/07scanner/download/urg_programs_en/ URG library homepage]&lt;br /&gt;
&lt;br /&gt;
[[Category:Robotics]]&lt;/div&gt;</summary>
		<author><name>OlivierR</name></author>
	</entry>
	<entry>
		<id>http://wikilegacy.armadeus.com/index.php?title=URG_laser&amp;diff=8413</id>
		<title>URG laser</title>
		<link rel="alternate" type="text/html" href="http://wikilegacy.armadeus.com/index.php?title=URG_laser&amp;diff=8413"/>
		<updated>2010-07-15T19:26:34Z</updated>

		<summary type="html">&lt;p&gt;OlivierR: /* Usage */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;How to drive Hoyuko&#039;s URG series laser sensors.&lt;br /&gt;
&lt;br /&gt;
==Installation==&lt;br /&gt;
&amp;lt;pre class=&amp;quot;host&amp;quot;&amp;gt;&lt;br /&gt;
$ make menuconfig&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;pre class=&amp;quot;config&amp;quot;&amp;gt;&lt;br /&gt;
Package Selection for the target  ---&amp;gt;&lt;br /&gt;
    Hardware handling / blockdevices and filesystem maintenance  ---&amp;gt;&lt;br /&gt;
        [*]   urg library&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;pre class=&amp;quot;host&amp;quot;&amp;gt;&lt;br /&gt;
$ make&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* reflash rootfs&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Usage==&lt;br /&gt;
&lt;br /&gt;
To use Hokoyu URG laser, you need Prolific pl2303 USB to serial adapter ( [[USB_to_serial_adapter | see here to install pl2303]]).&lt;br /&gt;
&lt;br /&gt;
Load the module and connect the URG laser to APF27 dev USB port. You should see something like this :&lt;br /&gt;
&amp;lt;pre class=&amp;quot;apf&amp;quot;&amp;gt;&lt;br /&gt;
# modprobe pl2303&lt;br /&gt;
usbcore: registered new interface driver usbserial&lt;br /&gt;
usbserial: USB Serial Driver core&lt;br /&gt;
USB Serial support registered for pl2303&lt;br /&gt;
usbcore: registered new interface driver pl2303&lt;br /&gt;
pl2303: Prolific PL2303 USB to serial adaptor driver&lt;br /&gt;
# usb 2-1: new full speed USB device using mxc-ehci and address 3&lt;br /&gt;
usb 2-1: device descriptor read/64, error -71&lt;br /&gt;
usb 2-1: New USB device found, idVendor=15d1, idProduct=0000&lt;br /&gt;
usb 2-1: New USB device strings: Mfr=1, Product=2, SerialNumber=0&lt;br /&gt;
usb 2-1: Product: URG-Series USB Driver&lt;br /&gt;
usb 2-1: Manufacturer: Hokuyo Data Flex for USB&lt;br /&gt;
usb 2-1: configuration #1 chosen from 1 choice&lt;br /&gt;
cdc_acm 2-1:1.0: ttyACM0: USB ACM device&lt;br /&gt;
# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
The URG laser is known as the /dev/ttyACM0 serial device.&lt;br /&gt;
&lt;br /&gt;
==Code example==&lt;br /&gt;
With your favorite editor/IDE, create the following program:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;lt;iostream&amp;gt;&lt;br /&gt;
#include &amp;quot;UrgCtrl.h&amp;quot;&lt;br /&gt;
using namespace std;&lt;br /&gt;
using namespace qrk;&lt;br /&gt;
&lt;br /&gt;
int main() {&lt;br /&gt;
&lt;br /&gt;
	const char device[] = &amp;quot;/dev/ttyACM0&amp;quot;;&lt;br /&gt;
	UrgCtrl urg;&lt;br /&gt;
	if (! urg.connect(device)) {&lt;br /&gt;
		cout &amp;lt;&amp;lt; &amp;quot;UrgCtrl::connect: &amp;quot; &amp;lt;&amp;lt; urg.what() &amp;lt;&amp;lt; endl;&lt;br /&gt;
		exit(1);&lt;br /&gt;
	}&lt;br /&gt;
	vector&amp;lt;long&amp;gt; data;&lt;br /&gt;
	long timestamp = 0;&lt;br /&gt;
	while (1)&lt;br /&gt;
	{&lt;br /&gt;
		int n = urg.capture(data, &amp;amp;timestamp);&lt;br /&gt;
		if (n &amp;lt; 0) {&lt;br /&gt;
			cout &amp;lt;&amp;lt; &amp;quot;UrgCtrl::capture: &amp;quot; &amp;lt;&amp;lt; urg.what() &amp;lt;&amp;lt; endl;&lt;br /&gt;
			exit(1);&lt;br /&gt;
		}&lt;br /&gt;
		cout &amp;lt;&amp;lt; &amp;quot;timestamp: &amp;quot; &amp;lt;&amp;lt; timestamp &amp;lt;&amp;lt; &amp;quot;\t range at 0 degree : &amp;quot; &amp;lt;&amp;lt; data[n/2] &amp;lt;&amp;lt; &amp;quot; mm&amp;quot; &amp;lt;&amp;lt;endl;&lt;br /&gt;
	}&lt;br /&gt;
	return 0;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Save it as &#039;&#039;laser.cpp&#039;&#039;. &lt;br /&gt;
==Compilation==&lt;br /&gt;
You can put your program compilation and installation in a &#039;&#039;Makefile&#039;&#039; to make things cleaner:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
CXX=arm-linux-g++&lt;br /&gt;
EXEC=laser&lt;br /&gt;
SRC= $(wildcard *.cpp)&lt;br /&gt;
OBJ= $(SRC:.c=.o)&lt;br /&gt;
ARM_LIBS=$(ARMADEUS_STAGING_DIR)/usr/lib&lt;br /&gt;
URG_INCLUDE=$(ARMADEUS_STAGING_DIR)/usr/include/urg&lt;br /&gt;
LD_URG=-lurg_monitor -lurg -lurg_coordinate -lurg_geometry -lurg_connection -lurg_connection_sdl -lurg_common -lurg_system &lt;br /&gt;
SDL_INCLUDE=$(ARMADEUS_STAGING_DIR)/usr/include/SDL -D_GNU_SOURCE=1 -D_REENTRANT&lt;br /&gt;
LD_SDL=-lSDL &lt;br /&gt;
LD_PTHREAD=-lpthread&lt;br /&gt;
LDFLAGS= &lt;br /&gt;
CXXFLAGS=-g  -W -Wall  -DNO_DETECT_OS_H &lt;br /&gt;
&lt;br /&gt;
all: $(EXEC)&lt;br /&gt;
&lt;br /&gt;
laser: laser.cpp&lt;br /&gt;
	$(CXX) $(CXXFLAGS) -I$(URG_INCLUDE) -I$(SDL_INCLUDE) -o $@ $^ $(LDFLAGS)  -L$(ARM_LIBS)  $(LD_URG) $(LD_SDL) $(LD_PTHREAD)&lt;br /&gt;
&lt;br /&gt;
.PHONY: clean install&lt;br /&gt;
 &lt;br /&gt;
clean:&lt;br /&gt;
	rm -rf *.o&lt;br /&gt;
	rm -f $(EXEC)&lt;br /&gt;
 &lt;br /&gt;
install: all&lt;br /&gt;
	cp -f $(EXEC) /tftpboot/&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;!! If you do a cut &amp;amp; paste with previous commands, don&#039;t forget to check TABS for each target (Makefiles are using TABS and not SPACES) !! In that case make will complains about a missing separator line 11&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Then, on host, just do:&lt;br /&gt;
 [host ]$ make clean install&lt;br /&gt;
&lt;br /&gt;
==Running==&lt;br /&gt;
Copy your &#039;&#039;laser&#039;&#039; executable on your board through TFTP (for example) &lt;br /&gt;
&lt;br /&gt;
* Be sure to have TFTP server installed, [[Connection_with_U-Boot_on_Linux#TFTP_server| if not it&#039;s explained here]]. Copy &#039;&#039;hello&#039;&#039; to your TFTP directory:&lt;br /&gt;
&amp;lt;pre class=&amp;quot;host&amp;quot;&amp;gt;&lt;br /&gt;
 [demos]$ cp laser /tftpboot/&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* Load your executable on the target (here my host IP is 192.168.1.13):&lt;br /&gt;
&amp;lt;pre class=&amp;quot;apf&amp;quot;&amp;gt;&lt;br /&gt;
 # tftp -g -r laser  192.168.1.13&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* Give it executable rights, if lost during TFTP transfer:&lt;br /&gt;
&amp;lt;pre class=&amp;quot;apf&amp;quot;&amp;gt;&lt;br /&gt;
 # chmod a+x laser&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* Launch it:&lt;br /&gt;
&amp;lt;pre class=&amp;quot;apf&amp;quot;&amp;gt;&lt;br /&gt;
 # ./laser&lt;br /&gt;
timestamp: 624546        range at 0 degree : 1219 mm&lt;br /&gt;
timestamp: 624646        range at 0 degree : 1217 mm&lt;br /&gt;
timestamp: 624746        range at 0 degree : 1210 mm&lt;br /&gt;
timestamp: 624846        range at 0 degree : 1213 mm&lt;br /&gt;
timestamp: 624946        range at 0 degree : 1207 mm&lt;br /&gt;
timestamp: 625046        range at 0 degree : 1213 mm&lt;br /&gt;
timestamp: 625145        range at 0 degree : 1211 mm&lt;br /&gt;
timestamp: 625245        range at 0 degree : 1220 mm&lt;br /&gt;
timestamp: 625345        range at 0 degree : 1220 mm&lt;br /&gt;
timestamp: 625445        range at 0 degree : 1205 mm&lt;br /&gt;
timestamp: 625545        range at 0 degree : 1216 mm&lt;br /&gt;
timestamp: 625645        range at 0 degree : 1214 mm&lt;br /&gt;
timestamp: 625745        range at 0 degree : 1225 mm&lt;br /&gt;
timestamp: 625845        range at 0 degree : 1217 mm&lt;br /&gt;
timestamp: 625945        range at 0 degree : 1221 mm&lt;br /&gt;
 #&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Now it&#039;s up to you ! ;-)&lt;br /&gt;
&lt;br /&gt;
==Links==&lt;br /&gt;
* [http://www.hokuyo-aut.jp/02sensor/07scanner/download/urg_programs_en/ URG library homepage]&lt;br /&gt;
&lt;br /&gt;
[[Category:Robotics]]&lt;/div&gt;</summary>
		<author><name>OlivierR</name></author>
	</entry>
	<entry>
		<id>http://wikilegacy.armadeus.com/index.php?title=URG_laser&amp;diff=8412</id>
		<title>URG laser</title>
		<link rel="alternate" type="text/html" href="http://wikilegacy.armadeus.com/index.php?title=URG_laser&amp;diff=8412"/>
		<updated>2010-07-15T19:26:24Z</updated>

		<summary type="html">&lt;p&gt;OlivierR: /* Usage */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;How to drive Hoyuko&#039;s URG series laser sensors.&lt;br /&gt;
&lt;br /&gt;
==Installation==&lt;br /&gt;
&amp;lt;pre class=&amp;quot;host&amp;quot;&amp;gt;&lt;br /&gt;
$ make menuconfig&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;pre class=&amp;quot;config&amp;quot;&amp;gt;&lt;br /&gt;
Package Selection for the target  ---&amp;gt;&lt;br /&gt;
    Hardware handling / blockdevices and filesystem maintenance  ---&amp;gt;&lt;br /&gt;
        [*]   urg library&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;pre class=&amp;quot;host&amp;quot;&amp;gt;&lt;br /&gt;
$ make&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* reflash rootfs&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Usage==&lt;br /&gt;
&lt;br /&gt;
To use Hokoyu URG laser, you need Prolific pl2303 USB to serial adapter ( [[USB_to_serial_adapter | see here to install pl2303]]).&lt;br /&gt;
&lt;br /&gt;
Load the module and connect the URG laser to APF27 dev USB port. You should see something like this :&lt;br /&gt;
&amp;lt;pre class=&amp;quot;apf&amp;quot;&amp;gt;&lt;br /&gt;
# modprobe pl2303&lt;br /&gt;
usbcore: registered new interface driver usbserial&lt;br /&gt;
usbserial: USB Serial Driver core&lt;br /&gt;
USB Serial support registered for pl2303&lt;br /&gt;
usbcore: registered new interface driver pl2303&lt;br /&gt;
pl2303: Prolific PL2303 USB to serial adaptor driver&lt;br /&gt;
# usb 2-1: new full speed USB device using mxc-ehci and address 3&lt;br /&gt;
usb 2-1: device descriptor read/64, error -71&lt;br /&gt;
usb 2-1: New USB device found, idVendor=15d1, idProduct=0000&lt;br /&gt;
usb 2-1: New USB device strings: Mfr=1, Product=2, SerialNumber=0&lt;br /&gt;
usb 2-1: Product: URG-Series USB Driver&lt;br /&gt;
usb 2-1: Manufacturer: Hokuyo Data Flex for USB&lt;br /&gt;
usb 2-1: configuration #1 chosen from 1 choice&lt;br /&gt;
cdc_acm 2-1:1.0: ttyACM0: USB ACM device&lt;br /&gt;
# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
The URG laser is known as the /dev/ttyACM0 device.&lt;br /&gt;
&lt;br /&gt;
==Code example==&lt;br /&gt;
With your favorite editor/IDE, create the following program:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;lt;iostream&amp;gt;&lt;br /&gt;
#include &amp;quot;UrgCtrl.h&amp;quot;&lt;br /&gt;
using namespace std;&lt;br /&gt;
using namespace qrk;&lt;br /&gt;
&lt;br /&gt;
int main() {&lt;br /&gt;
&lt;br /&gt;
	const char device[] = &amp;quot;/dev/ttyACM0&amp;quot;;&lt;br /&gt;
	UrgCtrl urg;&lt;br /&gt;
	if (! urg.connect(device)) {&lt;br /&gt;
		cout &amp;lt;&amp;lt; &amp;quot;UrgCtrl::connect: &amp;quot; &amp;lt;&amp;lt; urg.what() &amp;lt;&amp;lt; endl;&lt;br /&gt;
		exit(1);&lt;br /&gt;
	}&lt;br /&gt;
	vector&amp;lt;long&amp;gt; data;&lt;br /&gt;
	long timestamp = 0;&lt;br /&gt;
	while (1)&lt;br /&gt;
	{&lt;br /&gt;
		int n = urg.capture(data, &amp;amp;timestamp);&lt;br /&gt;
		if (n &amp;lt; 0) {&lt;br /&gt;
			cout &amp;lt;&amp;lt; &amp;quot;UrgCtrl::capture: &amp;quot; &amp;lt;&amp;lt; urg.what() &amp;lt;&amp;lt; endl;&lt;br /&gt;
			exit(1);&lt;br /&gt;
		}&lt;br /&gt;
		cout &amp;lt;&amp;lt; &amp;quot;timestamp: &amp;quot; &amp;lt;&amp;lt; timestamp &amp;lt;&amp;lt; &amp;quot;\t range at 0 degree : &amp;quot; &amp;lt;&amp;lt; data[n/2] &amp;lt;&amp;lt; &amp;quot; mm&amp;quot; &amp;lt;&amp;lt;endl;&lt;br /&gt;
	}&lt;br /&gt;
	return 0;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Save it as &#039;&#039;laser.cpp&#039;&#039;. &lt;br /&gt;
==Compilation==&lt;br /&gt;
You can put your program compilation and installation in a &#039;&#039;Makefile&#039;&#039; to make things cleaner:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
CXX=arm-linux-g++&lt;br /&gt;
EXEC=laser&lt;br /&gt;
SRC= $(wildcard *.cpp)&lt;br /&gt;
OBJ= $(SRC:.c=.o)&lt;br /&gt;
ARM_LIBS=$(ARMADEUS_STAGING_DIR)/usr/lib&lt;br /&gt;
URG_INCLUDE=$(ARMADEUS_STAGING_DIR)/usr/include/urg&lt;br /&gt;
LD_URG=-lurg_monitor -lurg -lurg_coordinate -lurg_geometry -lurg_connection -lurg_connection_sdl -lurg_common -lurg_system &lt;br /&gt;
SDL_INCLUDE=$(ARMADEUS_STAGING_DIR)/usr/include/SDL -D_GNU_SOURCE=1 -D_REENTRANT&lt;br /&gt;
LD_SDL=-lSDL &lt;br /&gt;
LD_PTHREAD=-lpthread&lt;br /&gt;
LDFLAGS= &lt;br /&gt;
CXXFLAGS=-g  -W -Wall  -DNO_DETECT_OS_H &lt;br /&gt;
&lt;br /&gt;
all: $(EXEC)&lt;br /&gt;
&lt;br /&gt;
laser: laser.cpp&lt;br /&gt;
	$(CXX) $(CXXFLAGS) -I$(URG_INCLUDE) -I$(SDL_INCLUDE) -o $@ $^ $(LDFLAGS)  -L$(ARM_LIBS)  $(LD_URG) $(LD_SDL) $(LD_PTHREAD)&lt;br /&gt;
&lt;br /&gt;
.PHONY: clean install&lt;br /&gt;
 &lt;br /&gt;
clean:&lt;br /&gt;
	rm -rf *.o&lt;br /&gt;
	rm -f $(EXEC)&lt;br /&gt;
 &lt;br /&gt;
install: all&lt;br /&gt;
	cp -f $(EXEC) /tftpboot/&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;!! If you do a cut &amp;amp; paste with previous commands, don&#039;t forget to check TABS for each target (Makefiles are using TABS and not SPACES) !! In that case make will complains about a missing separator line 11&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Then, on host, just do:&lt;br /&gt;
 [host ]$ make clean install&lt;br /&gt;
&lt;br /&gt;
==Running==&lt;br /&gt;
Copy your &#039;&#039;laser&#039;&#039; executable on your board through TFTP (for example) &lt;br /&gt;
&lt;br /&gt;
* Be sure to have TFTP server installed, [[Connection_with_U-Boot_on_Linux#TFTP_server| if not it&#039;s explained here]]. Copy &#039;&#039;hello&#039;&#039; to your TFTP directory:&lt;br /&gt;
&amp;lt;pre class=&amp;quot;host&amp;quot;&amp;gt;&lt;br /&gt;
 [demos]$ cp laser /tftpboot/&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* Load your executable on the target (here my host IP is 192.168.1.13):&lt;br /&gt;
&amp;lt;pre class=&amp;quot;apf&amp;quot;&amp;gt;&lt;br /&gt;
 # tftp -g -r laser  192.168.1.13&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* Give it executable rights, if lost during TFTP transfer:&lt;br /&gt;
&amp;lt;pre class=&amp;quot;apf&amp;quot;&amp;gt;&lt;br /&gt;
 # chmod a+x laser&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* Launch it:&lt;br /&gt;
&amp;lt;pre class=&amp;quot;apf&amp;quot;&amp;gt;&lt;br /&gt;
 # ./laser&lt;br /&gt;
timestamp: 624546        range at 0 degree : 1219 mm&lt;br /&gt;
timestamp: 624646        range at 0 degree : 1217 mm&lt;br /&gt;
timestamp: 624746        range at 0 degree : 1210 mm&lt;br /&gt;
timestamp: 624846        range at 0 degree : 1213 mm&lt;br /&gt;
timestamp: 624946        range at 0 degree : 1207 mm&lt;br /&gt;
timestamp: 625046        range at 0 degree : 1213 mm&lt;br /&gt;
timestamp: 625145        range at 0 degree : 1211 mm&lt;br /&gt;
timestamp: 625245        range at 0 degree : 1220 mm&lt;br /&gt;
timestamp: 625345        range at 0 degree : 1220 mm&lt;br /&gt;
timestamp: 625445        range at 0 degree : 1205 mm&lt;br /&gt;
timestamp: 625545        range at 0 degree : 1216 mm&lt;br /&gt;
timestamp: 625645        range at 0 degree : 1214 mm&lt;br /&gt;
timestamp: 625745        range at 0 degree : 1225 mm&lt;br /&gt;
timestamp: 625845        range at 0 degree : 1217 mm&lt;br /&gt;
timestamp: 625945        range at 0 degree : 1221 mm&lt;br /&gt;
 #&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Now it&#039;s up to you ! ;-)&lt;br /&gt;
&lt;br /&gt;
==Links==&lt;br /&gt;
* [http://www.hokuyo-aut.jp/02sensor/07scanner/download/urg_programs_en/ URG library homepage]&lt;br /&gt;
&lt;br /&gt;
[[Category:Robotics]]&lt;/div&gt;</summary>
		<author><name>OlivierR</name></author>
	</entry>
	<entry>
		<id>http://wikilegacy.armadeus.com/index.php?title=URG_laser&amp;diff=8411</id>
		<title>URG laser</title>
		<link rel="alternate" type="text/html" href="http://wikilegacy.armadeus.com/index.php?title=URG_laser&amp;diff=8411"/>
		<updated>2010-07-15T19:26:07Z</updated>

		<summary type="html">&lt;p&gt;OlivierR: /* Usage */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;How to drive Hoyuko&#039;s URG series laser sensors.&lt;br /&gt;
&lt;br /&gt;
==Installation==&lt;br /&gt;
&amp;lt;pre class=&amp;quot;host&amp;quot;&amp;gt;&lt;br /&gt;
$ make menuconfig&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;pre class=&amp;quot;config&amp;quot;&amp;gt;&lt;br /&gt;
Package Selection for the target  ---&amp;gt;&lt;br /&gt;
    Hardware handling / blockdevices and filesystem maintenance  ---&amp;gt;&lt;br /&gt;
        [*]   urg library&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;pre class=&amp;quot;host&amp;quot;&amp;gt;&lt;br /&gt;
$ make&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* reflash rootfs&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Usage==&lt;br /&gt;
&lt;br /&gt;
To use Hokoyu URG laser, you need Prolific pl2303 USB to serial adapter ( [[USB_to_serial_adapter | see here to install pl2303]]).&lt;br /&gt;
&lt;br /&gt;
Load the module and connect the URG laser to APF27 dev USB port. You should see something like this :&lt;br /&gt;
&amp;lt;pre class=&amp;quot;apf&amp;quot;&amp;gt;&lt;br /&gt;
# modprobe pl2303&lt;br /&gt;
usbcore: registered new interface driver usbserial&lt;br /&gt;
usbserial: USB Serial Driver core&lt;br /&gt;
USB Serial support registered for pl2303&lt;br /&gt;
usbcore: registered new interface driver pl2303&lt;br /&gt;
pl2303: Prolific PL2303 USB to serial adaptor driver&lt;br /&gt;
# usb 2-1: new full speed USB device using mxc-ehci and address 3&lt;br /&gt;
usb 2-1: device descriptor read/64, error -71&lt;br /&gt;
usb 2-1: New USB device found, idVendor=15d1, idProduct=0000&lt;br /&gt;
usb 2-1: New USB device strings: Mfr=1, Product=2, SerialNumber=0&lt;br /&gt;
usb 2-1: Product: URG-Series USB Driver&lt;br /&gt;
usb 2-1: Manufacturer: Hokuyo Data Flex for USB&lt;br /&gt;
usb 2-1: configuration #1 chosen from 1 choice&lt;br /&gt;
cdc_acm 2-1:1.0: ttyACM0: USB ACM device&lt;br /&gt;
# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
The URG laser is the /dev/ttyACM0 device.&lt;br /&gt;
&lt;br /&gt;
==Code example==&lt;br /&gt;
With your favorite editor/IDE, create the following program:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;lt;iostream&amp;gt;&lt;br /&gt;
#include &amp;quot;UrgCtrl.h&amp;quot;&lt;br /&gt;
using namespace std;&lt;br /&gt;
using namespace qrk;&lt;br /&gt;
&lt;br /&gt;
int main() {&lt;br /&gt;
&lt;br /&gt;
	const char device[] = &amp;quot;/dev/ttyACM0&amp;quot;;&lt;br /&gt;
	UrgCtrl urg;&lt;br /&gt;
	if (! urg.connect(device)) {&lt;br /&gt;
		cout &amp;lt;&amp;lt; &amp;quot;UrgCtrl::connect: &amp;quot; &amp;lt;&amp;lt; urg.what() &amp;lt;&amp;lt; endl;&lt;br /&gt;
		exit(1);&lt;br /&gt;
	}&lt;br /&gt;
	vector&amp;lt;long&amp;gt; data;&lt;br /&gt;
	long timestamp = 0;&lt;br /&gt;
	while (1)&lt;br /&gt;
	{&lt;br /&gt;
		int n = urg.capture(data, &amp;amp;timestamp);&lt;br /&gt;
		if (n &amp;lt; 0) {&lt;br /&gt;
			cout &amp;lt;&amp;lt; &amp;quot;UrgCtrl::capture: &amp;quot; &amp;lt;&amp;lt; urg.what() &amp;lt;&amp;lt; endl;&lt;br /&gt;
			exit(1);&lt;br /&gt;
		}&lt;br /&gt;
		cout &amp;lt;&amp;lt; &amp;quot;timestamp: &amp;quot; &amp;lt;&amp;lt; timestamp &amp;lt;&amp;lt; &amp;quot;\t range at 0 degree : &amp;quot; &amp;lt;&amp;lt; data[n/2] &amp;lt;&amp;lt; &amp;quot; mm&amp;quot; &amp;lt;&amp;lt;endl;&lt;br /&gt;
	}&lt;br /&gt;
	return 0;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Save it as &#039;&#039;laser.cpp&#039;&#039;. &lt;br /&gt;
==Compilation==&lt;br /&gt;
You can put your program compilation and installation in a &#039;&#039;Makefile&#039;&#039; to make things cleaner:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
CXX=arm-linux-g++&lt;br /&gt;
EXEC=laser&lt;br /&gt;
SRC= $(wildcard *.cpp)&lt;br /&gt;
OBJ= $(SRC:.c=.o)&lt;br /&gt;
ARM_LIBS=$(ARMADEUS_STAGING_DIR)/usr/lib&lt;br /&gt;
URG_INCLUDE=$(ARMADEUS_STAGING_DIR)/usr/include/urg&lt;br /&gt;
LD_URG=-lurg_monitor -lurg -lurg_coordinate -lurg_geometry -lurg_connection -lurg_connection_sdl -lurg_common -lurg_system &lt;br /&gt;
SDL_INCLUDE=$(ARMADEUS_STAGING_DIR)/usr/include/SDL -D_GNU_SOURCE=1 -D_REENTRANT&lt;br /&gt;
LD_SDL=-lSDL &lt;br /&gt;
LD_PTHREAD=-lpthread&lt;br /&gt;
LDFLAGS= &lt;br /&gt;
CXXFLAGS=-g  -W -Wall  -DNO_DETECT_OS_H &lt;br /&gt;
&lt;br /&gt;
all: $(EXEC)&lt;br /&gt;
&lt;br /&gt;
laser: laser.cpp&lt;br /&gt;
	$(CXX) $(CXXFLAGS) -I$(URG_INCLUDE) -I$(SDL_INCLUDE) -o $@ $^ $(LDFLAGS)  -L$(ARM_LIBS)  $(LD_URG) $(LD_SDL) $(LD_PTHREAD)&lt;br /&gt;
&lt;br /&gt;
.PHONY: clean install&lt;br /&gt;
 &lt;br /&gt;
clean:&lt;br /&gt;
	rm -rf *.o&lt;br /&gt;
	rm -f $(EXEC)&lt;br /&gt;
 &lt;br /&gt;
install: all&lt;br /&gt;
	cp -f $(EXEC) /tftpboot/&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;!! If you do a cut &amp;amp; paste with previous commands, don&#039;t forget to check TABS for each target (Makefiles are using TABS and not SPACES) !! In that case make will complains about a missing separator line 11&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Then, on host, just do:&lt;br /&gt;
 [host ]$ make clean install&lt;br /&gt;
&lt;br /&gt;
==Running==&lt;br /&gt;
Copy your &#039;&#039;laser&#039;&#039; executable on your board through TFTP (for example) &lt;br /&gt;
&lt;br /&gt;
* Be sure to have TFTP server installed, [[Connection_with_U-Boot_on_Linux#TFTP_server| if not it&#039;s explained here]]. Copy &#039;&#039;hello&#039;&#039; to your TFTP directory:&lt;br /&gt;
&amp;lt;pre class=&amp;quot;host&amp;quot;&amp;gt;&lt;br /&gt;
 [demos]$ cp laser /tftpboot/&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* Load your executable on the target (here my host IP is 192.168.1.13):&lt;br /&gt;
&amp;lt;pre class=&amp;quot;apf&amp;quot;&amp;gt;&lt;br /&gt;
 # tftp -g -r laser  192.168.1.13&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* Give it executable rights, if lost during TFTP transfer:&lt;br /&gt;
&amp;lt;pre class=&amp;quot;apf&amp;quot;&amp;gt;&lt;br /&gt;
 # chmod a+x laser&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* Launch it:&lt;br /&gt;
&amp;lt;pre class=&amp;quot;apf&amp;quot;&amp;gt;&lt;br /&gt;
 # ./laser&lt;br /&gt;
timestamp: 624546        range at 0 degree : 1219 mm&lt;br /&gt;
timestamp: 624646        range at 0 degree : 1217 mm&lt;br /&gt;
timestamp: 624746        range at 0 degree : 1210 mm&lt;br /&gt;
timestamp: 624846        range at 0 degree : 1213 mm&lt;br /&gt;
timestamp: 624946        range at 0 degree : 1207 mm&lt;br /&gt;
timestamp: 625046        range at 0 degree : 1213 mm&lt;br /&gt;
timestamp: 625145        range at 0 degree : 1211 mm&lt;br /&gt;
timestamp: 625245        range at 0 degree : 1220 mm&lt;br /&gt;
timestamp: 625345        range at 0 degree : 1220 mm&lt;br /&gt;
timestamp: 625445        range at 0 degree : 1205 mm&lt;br /&gt;
timestamp: 625545        range at 0 degree : 1216 mm&lt;br /&gt;
timestamp: 625645        range at 0 degree : 1214 mm&lt;br /&gt;
timestamp: 625745        range at 0 degree : 1225 mm&lt;br /&gt;
timestamp: 625845        range at 0 degree : 1217 mm&lt;br /&gt;
timestamp: 625945        range at 0 degree : 1221 mm&lt;br /&gt;
 #&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Now it&#039;s up to you ! ;-)&lt;br /&gt;
&lt;br /&gt;
==Links==&lt;br /&gt;
* [http://www.hokuyo-aut.jp/02sensor/07scanner/download/urg_programs_en/ URG library homepage]&lt;br /&gt;
&lt;br /&gt;
[[Category:Robotics]]&lt;/div&gt;</summary>
		<author><name>OlivierR</name></author>
	</entry>
	<entry>
		<id>http://wikilegacy.armadeus.com/index.php?title=URG_laser&amp;diff=8410</id>
		<title>URG laser</title>
		<link rel="alternate" type="text/html" href="http://wikilegacy.armadeus.com/index.php?title=URG_laser&amp;diff=8410"/>
		<updated>2010-07-15T19:25:12Z</updated>

		<summary type="html">&lt;p&gt;OlivierR: /* Compilation */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;How to drive Hoyuko&#039;s URG series laser sensors.&lt;br /&gt;
&lt;br /&gt;
==Installation==&lt;br /&gt;
&amp;lt;pre class=&amp;quot;host&amp;quot;&amp;gt;&lt;br /&gt;
$ make menuconfig&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;pre class=&amp;quot;config&amp;quot;&amp;gt;&lt;br /&gt;
Package Selection for the target  ---&amp;gt;&lt;br /&gt;
    Hardware handling / blockdevices and filesystem maintenance  ---&amp;gt;&lt;br /&gt;
        [*]   urg library&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;pre class=&amp;quot;host&amp;quot;&amp;gt;&lt;br /&gt;
$ make&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* reflash rootfs&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Usage==&lt;br /&gt;
&lt;br /&gt;
To use Hokoyu URG laser, you need Prolific pl2303 USB to serial adapter ( [[USB_to_serial_adapter | see here to install pl2303]]).&lt;br /&gt;
&lt;br /&gt;
Load the module and connect the URG laser to APF27 dev USB port. You should see something like this :&lt;br /&gt;
&amp;lt;pre class=&amp;quot;apf&amp;quot;&amp;gt;&lt;br /&gt;
# modprobe pl2303&lt;br /&gt;
usbcore: registered new interface driver usbserial&lt;br /&gt;
usbserial: USB Serial Driver core&lt;br /&gt;
USB Serial support registered for pl2303&lt;br /&gt;
usbcore: registered new interface driver pl2303&lt;br /&gt;
pl2303: Prolific PL2303 USB to serial adaptor driver&lt;br /&gt;
# usb 2-1: new full speed USB device using mxc-ehci and address 3&lt;br /&gt;
usb 2-1: device descriptor read/64, error -71&lt;br /&gt;
usb 2-1: New USB device found, idVendor=15d1, idProduct=0000&lt;br /&gt;
usb 2-1: New USB device strings: Mfr=1, Product=2, SerialNumber=0&lt;br /&gt;
usb 2-1: Product: URG-Series USB Driver&lt;br /&gt;
usb 2-1: Manufacturer: Hokuyo Data Flex for USB&lt;br /&gt;
usb 2-1: configuration #1 chosen from 1 choice&lt;br /&gt;
cdc_acm 2-1:1.0: ttyACM0: USB ACM device&lt;br /&gt;
# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Code example==&lt;br /&gt;
With your favorite editor/IDE, create the following program:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;lt;iostream&amp;gt;&lt;br /&gt;
#include &amp;quot;UrgCtrl.h&amp;quot;&lt;br /&gt;
using namespace std;&lt;br /&gt;
using namespace qrk;&lt;br /&gt;
&lt;br /&gt;
int main() {&lt;br /&gt;
&lt;br /&gt;
	const char device[] = &amp;quot;/dev/ttyACM0&amp;quot;;&lt;br /&gt;
	UrgCtrl urg;&lt;br /&gt;
	if (! urg.connect(device)) {&lt;br /&gt;
		cout &amp;lt;&amp;lt; &amp;quot;UrgCtrl::connect: &amp;quot; &amp;lt;&amp;lt; urg.what() &amp;lt;&amp;lt; endl;&lt;br /&gt;
		exit(1);&lt;br /&gt;
	}&lt;br /&gt;
	vector&amp;lt;long&amp;gt; data;&lt;br /&gt;
	long timestamp = 0;&lt;br /&gt;
	while (1)&lt;br /&gt;
	{&lt;br /&gt;
		int n = urg.capture(data, &amp;amp;timestamp);&lt;br /&gt;
		if (n &amp;lt; 0) {&lt;br /&gt;
			cout &amp;lt;&amp;lt; &amp;quot;UrgCtrl::capture: &amp;quot; &amp;lt;&amp;lt; urg.what() &amp;lt;&amp;lt; endl;&lt;br /&gt;
			exit(1);&lt;br /&gt;
		}&lt;br /&gt;
		cout &amp;lt;&amp;lt; &amp;quot;timestamp: &amp;quot; &amp;lt;&amp;lt; timestamp &amp;lt;&amp;lt; &amp;quot;\t range at 0 degree : &amp;quot; &amp;lt;&amp;lt; data[n/2] &amp;lt;&amp;lt; &amp;quot; mm&amp;quot; &amp;lt;&amp;lt;endl;&lt;br /&gt;
	}&lt;br /&gt;
	return 0;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Save it as &#039;&#039;laser.cpp&#039;&#039;. &lt;br /&gt;
==Compilation==&lt;br /&gt;
You can put your program compilation and installation in a &#039;&#039;Makefile&#039;&#039; to make things cleaner:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
CXX=arm-linux-g++&lt;br /&gt;
EXEC=laser&lt;br /&gt;
SRC= $(wildcard *.cpp)&lt;br /&gt;
OBJ= $(SRC:.c=.o)&lt;br /&gt;
ARM_LIBS=$(ARMADEUS_STAGING_DIR)/usr/lib&lt;br /&gt;
URG_INCLUDE=$(ARMADEUS_STAGING_DIR)/usr/include/urg&lt;br /&gt;
LD_URG=-lurg_monitor -lurg -lurg_coordinate -lurg_geometry -lurg_connection -lurg_connection_sdl -lurg_common -lurg_system &lt;br /&gt;
SDL_INCLUDE=$(ARMADEUS_STAGING_DIR)/usr/include/SDL -D_GNU_SOURCE=1 -D_REENTRANT&lt;br /&gt;
LD_SDL=-lSDL &lt;br /&gt;
LD_PTHREAD=-lpthread&lt;br /&gt;
LDFLAGS= &lt;br /&gt;
CXXFLAGS=-g  -W -Wall  -DNO_DETECT_OS_H &lt;br /&gt;
&lt;br /&gt;
all: $(EXEC)&lt;br /&gt;
&lt;br /&gt;
laser: laser.cpp&lt;br /&gt;
	$(CXX) $(CXXFLAGS) -I$(URG_INCLUDE) -I$(SDL_INCLUDE) -o $@ $^ $(LDFLAGS)  -L$(ARM_LIBS)  $(LD_URG) $(LD_SDL) $(LD_PTHREAD)&lt;br /&gt;
&lt;br /&gt;
.PHONY: clean install&lt;br /&gt;
 &lt;br /&gt;
clean:&lt;br /&gt;
	rm -rf *.o&lt;br /&gt;
	rm -f $(EXEC)&lt;br /&gt;
 &lt;br /&gt;
install: all&lt;br /&gt;
	cp -f $(EXEC) /tftpboot/&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;!! If you do a cut &amp;amp; paste with previous commands, don&#039;t forget to check TABS for each target (Makefiles are using TABS and not SPACES) !! In that case make will complains about a missing separator line 11&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Then, on host, just do:&lt;br /&gt;
 [host ]$ make clean install&lt;br /&gt;
&lt;br /&gt;
==Running==&lt;br /&gt;
Copy your &#039;&#039;laser&#039;&#039; executable on your board through TFTP (for example) &lt;br /&gt;
&lt;br /&gt;
* Be sure to have TFTP server installed, [[Connection_with_U-Boot_on_Linux#TFTP_server| if not it&#039;s explained here]]. Copy &#039;&#039;hello&#039;&#039; to your TFTP directory:&lt;br /&gt;
&amp;lt;pre class=&amp;quot;host&amp;quot;&amp;gt;&lt;br /&gt;
 [demos]$ cp laser /tftpboot/&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* Load your executable on the target (here my host IP is 192.168.1.13):&lt;br /&gt;
&amp;lt;pre class=&amp;quot;apf&amp;quot;&amp;gt;&lt;br /&gt;
 # tftp -g -r laser  192.168.1.13&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* Give it executable rights, if lost during TFTP transfer:&lt;br /&gt;
&amp;lt;pre class=&amp;quot;apf&amp;quot;&amp;gt;&lt;br /&gt;
 # chmod a+x laser&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* Launch it:&lt;br /&gt;
&amp;lt;pre class=&amp;quot;apf&amp;quot;&amp;gt;&lt;br /&gt;
 # ./laser&lt;br /&gt;
timestamp: 624546        range at 0 degree : 1219 mm&lt;br /&gt;
timestamp: 624646        range at 0 degree : 1217 mm&lt;br /&gt;
timestamp: 624746        range at 0 degree : 1210 mm&lt;br /&gt;
timestamp: 624846        range at 0 degree : 1213 mm&lt;br /&gt;
timestamp: 624946        range at 0 degree : 1207 mm&lt;br /&gt;
timestamp: 625046        range at 0 degree : 1213 mm&lt;br /&gt;
timestamp: 625145        range at 0 degree : 1211 mm&lt;br /&gt;
timestamp: 625245        range at 0 degree : 1220 mm&lt;br /&gt;
timestamp: 625345        range at 0 degree : 1220 mm&lt;br /&gt;
timestamp: 625445        range at 0 degree : 1205 mm&lt;br /&gt;
timestamp: 625545        range at 0 degree : 1216 mm&lt;br /&gt;
timestamp: 625645        range at 0 degree : 1214 mm&lt;br /&gt;
timestamp: 625745        range at 0 degree : 1225 mm&lt;br /&gt;
timestamp: 625845        range at 0 degree : 1217 mm&lt;br /&gt;
timestamp: 625945        range at 0 degree : 1221 mm&lt;br /&gt;
 #&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Now it&#039;s up to you ! ;-)&lt;br /&gt;
&lt;br /&gt;
==Links==&lt;br /&gt;
* [http://www.hokuyo-aut.jp/02sensor/07scanner/download/urg_programs_en/ URG library homepage]&lt;br /&gt;
&lt;br /&gt;
[[Category:Robotics]]&lt;/div&gt;</summary>
		<author><name>OlivierR</name></author>
	</entry>
	<entry>
		<id>http://wikilegacy.armadeus.com/index.php?title=URG_laser&amp;diff=8409</id>
		<title>URG laser</title>
		<link rel="alternate" type="text/html" href="http://wikilegacy.armadeus.com/index.php?title=URG_laser&amp;diff=8409"/>
		<updated>2010-07-15T19:22:06Z</updated>

		<summary type="html">&lt;p&gt;OlivierR: /* Code example */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;How to drive Hoyuko&#039;s URG series laser sensors.&lt;br /&gt;
&lt;br /&gt;
==Installation==&lt;br /&gt;
&amp;lt;pre class=&amp;quot;host&amp;quot;&amp;gt;&lt;br /&gt;
$ make menuconfig&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;pre class=&amp;quot;config&amp;quot;&amp;gt;&lt;br /&gt;
Package Selection for the target  ---&amp;gt;&lt;br /&gt;
    Hardware handling / blockdevices and filesystem maintenance  ---&amp;gt;&lt;br /&gt;
        [*]   urg library&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;pre class=&amp;quot;host&amp;quot;&amp;gt;&lt;br /&gt;
$ make&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* reflash rootfs&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Usage==&lt;br /&gt;
&lt;br /&gt;
To use Hokoyu URG laser, you need Prolific pl2303 USB to serial adapter ( [[USB_to_serial_adapter | see here to install pl2303]]).&lt;br /&gt;
&lt;br /&gt;
Load the module and connect the URG laser to APF27 dev USB port. You should see something like this :&lt;br /&gt;
&amp;lt;pre class=&amp;quot;apf&amp;quot;&amp;gt;&lt;br /&gt;
# modprobe pl2303&lt;br /&gt;
usbcore: registered new interface driver usbserial&lt;br /&gt;
usbserial: USB Serial Driver core&lt;br /&gt;
USB Serial support registered for pl2303&lt;br /&gt;
usbcore: registered new interface driver pl2303&lt;br /&gt;
pl2303: Prolific PL2303 USB to serial adaptor driver&lt;br /&gt;
# usb 2-1: new full speed USB device using mxc-ehci and address 3&lt;br /&gt;
usb 2-1: device descriptor read/64, error -71&lt;br /&gt;
usb 2-1: New USB device found, idVendor=15d1, idProduct=0000&lt;br /&gt;
usb 2-1: New USB device strings: Mfr=1, Product=2, SerialNumber=0&lt;br /&gt;
usb 2-1: Product: URG-Series USB Driver&lt;br /&gt;
usb 2-1: Manufacturer: Hokuyo Data Flex for USB&lt;br /&gt;
usb 2-1: configuration #1 chosen from 1 choice&lt;br /&gt;
cdc_acm 2-1:1.0: ttyACM0: USB ACM device&lt;br /&gt;
# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Code example==&lt;br /&gt;
With your favorite editor/IDE, create the following program:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;lt;iostream&amp;gt;&lt;br /&gt;
#include &amp;quot;UrgCtrl.h&amp;quot;&lt;br /&gt;
using namespace std;&lt;br /&gt;
using namespace qrk;&lt;br /&gt;
&lt;br /&gt;
int main() {&lt;br /&gt;
&lt;br /&gt;
	const char device[] = &amp;quot;/dev/ttyACM0&amp;quot;;&lt;br /&gt;
	UrgCtrl urg;&lt;br /&gt;
	if (! urg.connect(device)) {&lt;br /&gt;
		cout &amp;lt;&amp;lt; &amp;quot;UrgCtrl::connect: &amp;quot; &amp;lt;&amp;lt; urg.what() &amp;lt;&amp;lt; endl;&lt;br /&gt;
		exit(1);&lt;br /&gt;
	}&lt;br /&gt;
	vector&amp;lt;long&amp;gt; data;&lt;br /&gt;
	long timestamp = 0;&lt;br /&gt;
	while (1)&lt;br /&gt;
	{&lt;br /&gt;
		int n = urg.capture(data, &amp;amp;timestamp);&lt;br /&gt;
		if (n &amp;lt; 0) {&lt;br /&gt;
			cout &amp;lt;&amp;lt; &amp;quot;UrgCtrl::capture: &amp;quot; &amp;lt;&amp;lt; urg.what() &amp;lt;&amp;lt; endl;&lt;br /&gt;
			exit(1);&lt;br /&gt;
		}&lt;br /&gt;
		cout &amp;lt;&amp;lt; &amp;quot;timestamp: &amp;quot; &amp;lt;&amp;lt; timestamp &amp;lt;&amp;lt; &amp;quot;\t range at 0 degree : &amp;quot; &amp;lt;&amp;lt; data[n/2] &amp;lt;&amp;lt; &amp;quot; mm&amp;quot; &amp;lt;&amp;lt;endl;&lt;br /&gt;
	}&lt;br /&gt;
	return 0;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Save it as &#039;&#039;laser.cpp&#039;&#039;. &lt;br /&gt;
==Compilation==&lt;br /&gt;
You can put your program compilation and installation in a &#039;&#039;Makefile&#039;&#039; to make things cleaner:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
CXX=arm-linux-g++&lt;br /&gt;
EXEC=laser&lt;br /&gt;
SRC= $(wildcard *.cpp)&lt;br /&gt;
OBJ= $(SRC:.c=.o)&lt;br /&gt;
ARM_LIBS=$(ARMADEUS_STAGING_DIR)/usr/lib&lt;br /&gt;
URG_INCLUDE=$(ARMADEUS_STAGING_DIR)/usr/include/urg&lt;br /&gt;
LD_URG=-lurg_monitor -lurg -lurg_coordinate -lurg_geometry -lurg_connection -lurg_connection_sdl -lurg_common -lurg_system &lt;br /&gt;
SDL_INCLUDE=$(ARMADEUS_STAGING_DIR)/usr/include/SDL -D_GNU_SOURCE=1 -D_REENTRANT&lt;br /&gt;
LD_SDL=-lSDL &lt;br /&gt;
LD_PTHREAD=-lpthread&lt;br /&gt;
LDFLAGS= &lt;br /&gt;
CXXFLAGS=-g  -W -Wall  -DNO_DETECT_OS_H &lt;br /&gt;
&lt;br /&gt;
all: $(EXEC)&lt;br /&gt;
&lt;br /&gt;
laser: laser.cpp&lt;br /&gt;
	$(CXX) $(CXXFLAGS) -I$(URG_INCLUDE) -I$(SDL_INCLUDE) -o $@ $^ $(LDFLAGS)  -L$(ARM_LIBS)  $(LD_URG) $(LD_SDL) $(LD_PTHREAD)&lt;br /&gt;
&lt;br /&gt;
.PHONY: clean install&lt;br /&gt;
 &lt;br /&gt;
clean:&lt;br /&gt;
	rm -rf *.o&lt;br /&gt;
	rm -f $(EXEC)&lt;br /&gt;
 &lt;br /&gt;
install: all&lt;br /&gt;
	cp -f $(EXEC) /var/lib/tftpboot/&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;!! If you do a cut &amp;amp; paste with previous commands, don&#039;t forget to check TABS for each target (Makefiles are using TABS and not SPACES) !! In that case make will complains about a missing separator line 11&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Then, on host, just do:&lt;br /&gt;
 [host ]$ make clean install&lt;br /&gt;
&lt;br /&gt;
==Links==&lt;br /&gt;
* [http://www.hokuyo-aut.jp/02sensor/07scanner/download/urg_programs_en/ URG library homepage]&lt;br /&gt;
&lt;br /&gt;
[[Category:Robotics]]&lt;/div&gt;</summary>
		<author><name>OlivierR</name></author>
	</entry>
	<entry>
		<id>http://wikilegacy.armadeus.com/index.php?title=URG_laser&amp;diff=8408</id>
		<title>URG laser</title>
		<link rel="alternate" type="text/html" href="http://wikilegacy.armadeus.com/index.php?title=URG_laser&amp;diff=8408"/>
		<updated>2010-07-15T19:20:33Z</updated>

		<summary type="html">&lt;p&gt;OlivierR: /* Code example */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;How to drive Hoyuko&#039;s URG series laser sensors.&lt;br /&gt;
&lt;br /&gt;
==Installation==&lt;br /&gt;
&amp;lt;pre class=&amp;quot;host&amp;quot;&amp;gt;&lt;br /&gt;
$ make menuconfig&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;pre class=&amp;quot;config&amp;quot;&amp;gt;&lt;br /&gt;
Package Selection for the target  ---&amp;gt;&lt;br /&gt;
    Hardware handling / blockdevices and filesystem maintenance  ---&amp;gt;&lt;br /&gt;
        [*]   urg library&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;pre class=&amp;quot;host&amp;quot;&amp;gt;&lt;br /&gt;
$ make&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* reflash rootfs&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Usage==&lt;br /&gt;
&lt;br /&gt;
To use Hokoyu URG laser, you need Prolific pl2303 USB to serial adapter ( [[USB_to_serial_adapter | see here to install pl2303]]).&lt;br /&gt;
&lt;br /&gt;
Load the module and connect the URG laser to APF27 dev USB port. You should see something like this :&lt;br /&gt;
&amp;lt;pre class=&amp;quot;apf&amp;quot;&amp;gt;&lt;br /&gt;
# modprobe pl2303&lt;br /&gt;
usbcore: registered new interface driver usbserial&lt;br /&gt;
usbserial: USB Serial Driver core&lt;br /&gt;
USB Serial support registered for pl2303&lt;br /&gt;
usbcore: registered new interface driver pl2303&lt;br /&gt;
pl2303: Prolific PL2303 USB to serial adaptor driver&lt;br /&gt;
# usb 2-1: new full speed USB device using mxc-ehci and address 3&lt;br /&gt;
usb 2-1: device descriptor read/64, error -71&lt;br /&gt;
usb 2-1: New USB device found, idVendor=15d1, idProduct=0000&lt;br /&gt;
usb 2-1: New USB device strings: Mfr=1, Product=2, SerialNumber=0&lt;br /&gt;
usb 2-1: Product: URG-Series USB Driver&lt;br /&gt;
usb 2-1: Manufacturer: Hokuyo Data Flex for USB&lt;br /&gt;
usb 2-1: configuration #1 chosen from 1 choice&lt;br /&gt;
cdc_acm 2-1:1.0: ttyACM0: USB ACM device&lt;br /&gt;
# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Code example==&lt;br /&gt;
With your favorite editor/IDE, create the following program:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;lt;iostream&amp;gt;&lt;br /&gt;
#include &amp;quot;UrgCtrl.h&amp;quot;&lt;br /&gt;
using namespace std;&lt;br /&gt;
using namespace qrk;&lt;br /&gt;
&lt;br /&gt;
int main() {&lt;br /&gt;
&lt;br /&gt;
	const char device[] = &amp;quot;/dev/ttyACM0&amp;quot;;&lt;br /&gt;
	UrgCtrl urg;&lt;br /&gt;
	if (! urg.connect(device)) {&lt;br /&gt;
		cout &amp;lt;&amp;lt; &amp;quot;UrgCtrl::connect: &amp;quot; &amp;lt;&amp;lt; urg.what() &amp;lt;&amp;lt; endl;&lt;br /&gt;
		exit(1);&lt;br /&gt;
	}&lt;br /&gt;
	vector&amp;lt;long&amp;gt; data;&lt;br /&gt;
	long timestamp = 0;&lt;br /&gt;
	while (1)&lt;br /&gt;
	{&lt;br /&gt;
		int n = urg.capture(data, &amp;amp;timestamp);&lt;br /&gt;
		if (n &amp;lt; 0) {&lt;br /&gt;
			cout &amp;lt;&amp;lt; &amp;quot;UrgCtrl::capture: &amp;quot; &amp;lt;&amp;lt; urg.what() &amp;lt;&amp;lt; endl;&lt;br /&gt;
			exit(1);&lt;br /&gt;
		}&lt;br /&gt;
		cout &amp;lt;&amp;lt; &amp;quot;timestamp: &amp;quot; &amp;lt;&amp;lt; timestamp &amp;lt;&amp;lt; &amp;quot;\t range at 0 degree : &amp;quot; &amp;lt;&amp;lt; data[n/2] &amp;lt;&amp;lt; &amp;quot; mm&amp;quot; &amp;lt;&amp;lt;endl;&lt;br /&gt;
	}&lt;br /&gt;
	return 0;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Save it as &#039;&#039;laser.cpp&#039;&#039;. &lt;br /&gt;
&lt;br /&gt;
You can put your program compilation and installation in a &#039;&#039;Makefile&#039;&#039; to make things cleaner:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
CXX=arm-linux-g++&lt;br /&gt;
EXEC=laser&lt;br /&gt;
SRC= $(wildcard *.cpp)&lt;br /&gt;
OBJ= $(SRC:.c=.o)&lt;br /&gt;
ARM_LIBS=$(ARMADEUS_STAGING_DIR)/usr/lib&lt;br /&gt;
URG_INCLUDE=$(ARMADEUS_STAGING_DIR)/usr/include/urg&lt;br /&gt;
LD_URG=-lurg_monitor -lurg -lurg_coordinate -lurg_geometry -lurg_connection -lurg_connection_sdl -lurg_common -lurg_system &lt;br /&gt;
SDL_INCLUDE=$(ARMADEUS_STAGING_DIR)/usr/include/SDL -D_GNU_SOURCE=1 -D_REENTRANT&lt;br /&gt;
LD_SDL=-lSDL &lt;br /&gt;
LD_PTHREAD=-lpthread&lt;br /&gt;
LDFLAGS= &lt;br /&gt;
CXXFLAGS=-g  -W -Wall  -DNO_DETECT_OS_H &lt;br /&gt;
&lt;br /&gt;
all: $(EXEC)&lt;br /&gt;
&lt;br /&gt;
laser: laser.cpp&lt;br /&gt;
	$(CXX) $(CXXFLAGS) -I$(URG_INCLUDE) -I$(SDL_INCLUDE) -o $@ $^ $(LDFLAGS)  -L$(ARM_LIBS)  $(LD_URG) $(LD_SDL) $(LD_PTHREAD)&lt;br /&gt;
&lt;br /&gt;
.PHONY: clean install&lt;br /&gt;
 &lt;br /&gt;
clean:&lt;br /&gt;
	rm -rf *.o&lt;br /&gt;
	rm -f $(EXEC)&lt;br /&gt;
 &lt;br /&gt;
install: all&lt;br /&gt;
	cp -f $(EXEC) /var/lib/tftpboot/&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;!! If you do a cut &amp;amp; paste with previous commands, don&#039;t forget to check TABS for each target (Makefiles are using TABS and not SPACES) !! In that case make will complains about a missing separator line 11&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Then, on hots, just do:&lt;br /&gt;
 [host demos]$ make clean install&lt;br /&gt;
&lt;br /&gt;
==Links==&lt;br /&gt;
* [http://www.hokuyo-aut.jp/02sensor/07scanner/download/urg_programs_en/ URG library homepage]&lt;br /&gt;
&lt;br /&gt;
[[Category:Robotics]]&lt;/div&gt;</summary>
		<author><name>OlivierR</name></author>
	</entry>
	<entry>
		<id>http://wikilegacy.armadeus.com/index.php?title=URG_laser&amp;diff=8407</id>
		<title>URG laser</title>
		<link rel="alternate" type="text/html" href="http://wikilegacy.armadeus.com/index.php?title=URG_laser&amp;diff=8407"/>
		<updated>2010-07-15T19:19:14Z</updated>

		<summary type="html">&lt;p&gt;OlivierR: /* Code example */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;How to drive Hoyuko&#039;s URG series laser sensors.&lt;br /&gt;
&lt;br /&gt;
==Installation==&lt;br /&gt;
&amp;lt;pre class=&amp;quot;host&amp;quot;&amp;gt;&lt;br /&gt;
$ make menuconfig&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;pre class=&amp;quot;config&amp;quot;&amp;gt;&lt;br /&gt;
Package Selection for the target  ---&amp;gt;&lt;br /&gt;
    Hardware handling / blockdevices and filesystem maintenance  ---&amp;gt;&lt;br /&gt;
        [*]   urg library&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;pre class=&amp;quot;host&amp;quot;&amp;gt;&lt;br /&gt;
$ make&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* reflash rootfs&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Usage==&lt;br /&gt;
&lt;br /&gt;
To use Hokoyu URG laser, you need Prolific pl2303 USB to serial adapter ( [[USB_to_serial_adapter | see here to install pl2303]]).&lt;br /&gt;
&lt;br /&gt;
Load the module and connect the URG laser to APF27 dev USB port. You should see something like this :&lt;br /&gt;
&amp;lt;pre class=&amp;quot;apf&amp;quot;&amp;gt;&lt;br /&gt;
# modprobe pl2303&lt;br /&gt;
usbcore: registered new interface driver usbserial&lt;br /&gt;
usbserial: USB Serial Driver core&lt;br /&gt;
USB Serial support registered for pl2303&lt;br /&gt;
usbcore: registered new interface driver pl2303&lt;br /&gt;
pl2303: Prolific PL2303 USB to serial adaptor driver&lt;br /&gt;
# usb 2-1: new full speed USB device using mxc-ehci and address 3&lt;br /&gt;
usb 2-1: device descriptor read/64, error -71&lt;br /&gt;
usb 2-1: New USB device found, idVendor=15d1, idProduct=0000&lt;br /&gt;
usb 2-1: New USB device strings: Mfr=1, Product=2, SerialNumber=0&lt;br /&gt;
usb 2-1: Product: URG-Series USB Driver&lt;br /&gt;
usb 2-1: Manufacturer: Hokuyo Data Flex for USB&lt;br /&gt;
usb 2-1: configuration #1 chosen from 1 choice&lt;br /&gt;
cdc_acm 2-1:1.0: ttyACM0: USB ACM device&lt;br /&gt;
# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Code example==&lt;br /&gt;
With your favorite editor/IDE, create the following program:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;lt;iostream&amp;gt;&lt;br /&gt;
#include &amp;quot;UrgCtrl.h&amp;quot;&lt;br /&gt;
using namespace std;&lt;br /&gt;
using namespace qrk;&lt;br /&gt;
&lt;br /&gt;
int main() {&lt;br /&gt;
&lt;br /&gt;
	const char device[] = &amp;quot;/dev/ttyACM0&amp;quot;;&lt;br /&gt;
	UrgCtrl urg;&lt;br /&gt;
	if (! urg.connect(device)) {&lt;br /&gt;
		cout &amp;lt;&amp;lt; &amp;quot;UrgCtrl::connect: &amp;quot; &amp;lt;&amp;lt; urg.what() &amp;lt;&amp;lt; endl;&lt;br /&gt;
		exit(1);&lt;br /&gt;
	}&lt;br /&gt;
	vector&amp;lt;long&amp;gt; data;&lt;br /&gt;
	long timestamp = 0;&lt;br /&gt;
	while (1)&lt;br /&gt;
	{&lt;br /&gt;
		int n = urg.capture(data, &amp;amp;timestamp);&lt;br /&gt;
		if (n &amp;lt; 0) {&lt;br /&gt;
			cout &amp;lt;&amp;lt; &amp;quot;UrgCtrl::capture: &amp;quot; &amp;lt;&amp;lt; urg.what() &amp;lt;&amp;lt; endl;&lt;br /&gt;
			exit(1);&lt;br /&gt;
		}&lt;br /&gt;
		cout &amp;lt;&amp;lt; &amp;quot;timestamp: &amp;quot; &amp;lt;&amp;lt; timestamp &amp;lt;&amp;lt; &amp;quot;\t range at 0 degree : &amp;quot; &amp;lt;&amp;lt; data[n/2] &amp;lt;&amp;lt; &amp;quot; mm&amp;quot; &amp;lt;&amp;lt;endl;&lt;br /&gt;
	}&lt;br /&gt;
	return 0;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Save it as &#039;&#039;laser.cpp&#039;&#039;. &lt;br /&gt;
You can put your program compilation and installation in a &#039;&#039;Makefile&#039;&#039; to make things cleaner:&lt;br /&gt;
CXX=arm-linux-g++&lt;br /&gt;
EXEC=laser&lt;br /&gt;
SRC= $(wildcard *.cpp)&lt;br /&gt;
OBJ= $(SRC:.c=.o)&lt;br /&gt;
ARM_LIBS=$(ARMADEUS_STAGING_DIR)/usr/lib&lt;br /&gt;
URG_INCLUDE=$(ARMADEUS_STAGING_DIR)/usr/include/urg&lt;br /&gt;
LD_URG=-lurg_monitor -lurg -lurg_coordinate -lurg_geometry -lurg_connection -lurg_connection_sdl -lurg_common -lurg_system &lt;br /&gt;
SDL_INCLUDE=$(ARMADEUS_STAGING_DIR)/usr/include/SDL -D_GNU_SOURCE=1 -D_REENTRANT&lt;br /&gt;
LD_SDL=-lSDL &lt;br /&gt;
LD_PTHREAD=-lpthread&lt;br /&gt;
LDFLAGS= &lt;br /&gt;
CXXFLAGS=-g  -W -Wall  -DNO_DETECT_OS_H &lt;br /&gt;
&lt;br /&gt;
all: $(EXEC)&lt;br /&gt;
&lt;br /&gt;
laser: laser.cpp&lt;br /&gt;
	$(CXX) $(CXXFLAGS) -I$(URG_INCLUDE) -I$(SDL_INCLUDE) -o $@ $^ $(LDFLAGS)  -L$(ARM_LIBS)  $(LD_URG) $(LD_SDL) $(LD_PTHREAD)&lt;br /&gt;
&lt;br /&gt;
.PHONY: clean install&lt;br /&gt;
 &lt;br /&gt;
clean:&lt;br /&gt;
	rm -rf *.o&lt;br /&gt;
	rm -f $(EXEC)&lt;br /&gt;
 &lt;br /&gt;
install: all&lt;br /&gt;
	cp -f $(EXEC) /var/lib/tftpboot/&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;!! If you do a cut &amp;amp; paste with previous commands, don&#039;t forget to check TABS for each target (Makefiles are using TABS and not SPACES) !! In that case make will complains about a missing separator line 11&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Then, on hots, just do:&lt;br /&gt;
 [host demos]$ make clean install&lt;br /&gt;
&lt;br /&gt;
==Links==&lt;br /&gt;
* [http://www.hokuyo-aut.jp/02sensor/07scanner/download/urg_programs_en/ URG library homepage]&lt;br /&gt;
&lt;br /&gt;
[[Category:Robotics]]&lt;/div&gt;</summary>
		<author><name>OlivierR</name></author>
	</entry>
	<entry>
		<id>http://wikilegacy.armadeus.com/index.php?title=URG_laser&amp;diff=8406</id>
		<title>URG laser</title>
		<link rel="alternate" type="text/html" href="http://wikilegacy.armadeus.com/index.php?title=URG_laser&amp;diff=8406"/>
		<updated>2010-07-15T19:17:09Z</updated>

		<summary type="html">&lt;p&gt;OlivierR: /* Code example */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;How to drive Hoyuko&#039;s URG series laser sensors.&lt;br /&gt;
&lt;br /&gt;
==Installation==&lt;br /&gt;
&amp;lt;pre class=&amp;quot;host&amp;quot;&amp;gt;&lt;br /&gt;
$ make menuconfig&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;pre class=&amp;quot;config&amp;quot;&amp;gt;&lt;br /&gt;
Package Selection for the target  ---&amp;gt;&lt;br /&gt;
    Hardware handling / blockdevices and filesystem maintenance  ---&amp;gt;&lt;br /&gt;
        [*]   urg library&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;pre class=&amp;quot;host&amp;quot;&amp;gt;&lt;br /&gt;
$ make&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* reflash rootfs&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Usage==&lt;br /&gt;
&lt;br /&gt;
To use Hokoyu URG laser, you need Prolific pl2303 USB to serial adapter ( [[USB_to_serial_adapter | see here to install pl2303]]).&lt;br /&gt;
&lt;br /&gt;
Load the module and connect the URG laser to APF27 dev USB port. You should see something like this :&lt;br /&gt;
&amp;lt;pre class=&amp;quot;apf&amp;quot;&amp;gt;&lt;br /&gt;
# modprobe pl2303&lt;br /&gt;
usbcore: registered new interface driver usbserial&lt;br /&gt;
usbserial: USB Serial Driver core&lt;br /&gt;
USB Serial support registered for pl2303&lt;br /&gt;
usbcore: registered new interface driver pl2303&lt;br /&gt;
pl2303: Prolific PL2303 USB to serial adaptor driver&lt;br /&gt;
# usb 2-1: new full speed USB device using mxc-ehci and address 3&lt;br /&gt;
usb 2-1: device descriptor read/64, error -71&lt;br /&gt;
usb 2-1: New USB device found, idVendor=15d1, idProduct=0000&lt;br /&gt;
usb 2-1: New USB device strings: Mfr=1, Product=2, SerialNumber=0&lt;br /&gt;
usb 2-1: Product: URG-Series USB Driver&lt;br /&gt;
usb 2-1: Manufacturer: Hokuyo Data Flex for USB&lt;br /&gt;
usb 2-1: configuration #1 chosen from 1 choice&lt;br /&gt;
cdc_acm 2-1:1.0: ttyACM0: USB ACM device&lt;br /&gt;
# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Code example==&lt;br /&gt;
With your favorite editor/IDE, create the following program:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;lt;iostream&amp;gt;&lt;br /&gt;
#include &amp;quot;UrgCtrl.h&amp;quot;&lt;br /&gt;
using namespace std;&lt;br /&gt;
using namespace qrk;&lt;br /&gt;
&lt;br /&gt;
int main() {&lt;br /&gt;
&lt;br /&gt;
	const char device[] = &amp;quot;/dev/ttyACM0&amp;quot;;&lt;br /&gt;
	UrgCtrl urg;&lt;br /&gt;
	if (! urg.connect(device)) {&lt;br /&gt;
		cout &amp;lt;&amp;lt; &amp;quot;UrgCtrl::connect: &amp;quot; &amp;lt;&amp;lt; urg.what() &amp;lt;&amp;lt; endl;&lt;br /&gt;
		exit(1);&lt;br /&gt;
	}&lt;br /&gt;
	vector&amp;lt;long&amp;gt; data;&lt;br /&gt;
	long timestamp = 0;&lt;br /&gt;
	while (1)&lt;br /&gt;
	{&lt;br /&gt;
		int n = urg.capture(data, &amp;amp;timestamp);&lt;br /&gt;
		if (n &amp;lt; 0) {&lt;br /&gt;
			cout &amp;lt;&amp;lt; &amp;quot;UrgCtrl::capture: &amp;quot; &amp;lt;&amp;lt; urg.what() &amp;lt;&amp;lt; endl;&lt;br /&gt;
			exit(1);&lt;br /&gt;
		}&lt;br /&gt;
		cout &amp;lt;&amp;lt; &amp;quot;timestamp: &amp;quot; &amp;lt;&amp;lt; timestamp &amp;lt;&amp;lt; &amp;quot;\t range at 0 degree : &amp;quot; &amp;lt;&amp;lt; data[n/2] &amp;lt;&amp;lt; &amp;quot; mm&amp;quot; &amp;lt;&amp;lt;endl;&lt;br /&gt;
	}&lt;br /&gt;
	return 0;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Save it as &#039;&#039;laser.cpp&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
==Links==&lt;br /&gt;
* [http://www.hokuyo-aut.jp/02sensor/07scanner/download/urg_programs_en/ URG library homepage]&lt;br /&gt;
&lt;br /&gt;
[[Category:Robotics]]&lt;/div&gt;</summary>
		<author><name>OlivierR</name></author>
	</entry>
	<entry>
		<id>http://wikilegacy.armadeus.com/index.php?title=URG_laser&amp;diff=8405</id>
		<title>URG laser</title>
		<link rel="alternate" type="text/html" href="http://wikilegacy.armadeus.com/index.php?title=URG_laser&amp;diff=8405"/>
		<updated>2010-07-15T19:16:47Z</updated>

		<summary type="html">&lt;p&gt;OlivierR: /* Code example */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;How to drive Hoyuko&#039;s URG series laser sensors.&lt;br /&gt;
&lt;br /&gt;
==Installation==&lt;br /&gt;
&amp;lt;pre class=&amp;quot;host&amp;quot;&amp;gt;&lt;br /&gt;
$ make menuconfig&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;pre class=&amp;quot;config&amp;quot;&amp;gt;&lt;br /&gt;
Package Selection for the target  ---&amp;gt;&lt;br /&gt;
    Hardware handling / blockdevices and filesystem maintenance  ---&amp;gt;&lt;br /&gt;
        [*]   urg library&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;pre class=&amp;quot;host&amp;quot;&amp;gt;&lt;br /&gt;
$ make&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* reflash rootfs&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Usage==&lt;br /&gt;
&lt;br /&gt;
To use Hokoyu URG laser, you need Prolific pl2303 USB to serial adapter ( [[USB_to_serial_adapter | see here to install pl2303]]).&lt;br /&gt;
&lt;br /&gt;
Load the module and connect the URG laser to APF27 dev USB port. You should see something like this :&lt;br /&gt;
&amp;lt;pre class=&amp;quot;apf&amp;quot;&amp;gt;&lt;br /&gt;
# modprobe pl2303&lt;br /&gt;
usbcore: registered new interface driver usbserial&lt;br /&gt;
usbserial: USB Serial Driver core&lt;br /&gt;
USB Serial support registered for pl2303&lt;br /&gt;
usbcore: registered new interface driver pl2303&lt;br /&gt;
pl2303: Prolific PL2303 USB to serial adaptor driver&lt;br /&gt;
# usb 2-1: new full speed USB device using mxc-ehci and address 3&lt;br /&gt;
usb 2-1: device descriptor read/64, error -71&lt;br /&gt;
usb 2-1: New USB device found, idVendor=15d1, idProduct=0000&lt;br /&gt;
usb 2-1: New USB device strings: Mfr=1, Product=2, SerialNumber=0&lt;br /&gt;
usb 2-1: Product: URG-Series USB Driver&lt;br /&gt;
usb 2-1: Manufacturer: Hokuyo Data Flex for USB&lt;br /&gt;
usb 2-1: configuration #1 chosen from 1 choice&lt;br /&gt;
cdc_acm 2-1:1.0: ttyACM0: USB ACM device&lt;br /&gt;
# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Code example==&lt;br /&gt;
With your favorite editor/IDE, create the following program:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;lt;iostream&amp;gt;&lt;br /&gt;
#include &amp;quot;UrgCtrl.h&amp;quot;&lt;br /&gt;
using namespace std;&lt;br /&gt;
using namespace qrk;&lt;br /&gt;
&lt;br /&gt;
int main() {&lt;br /&gt;
&lt;br /&gt;
	const char device[] = &amp;quot;/dev/ttyACM0&amp;quot;;&lt;br /&gt;
	UrgCtrl urg;&lt;br /&gt;
	if (! urg.connect(device)) {&lt;br /&gt;
		cout &amp;lt;&amp;lt; &amp;quot;UrgCtrl::connect: &amp;quot; &amp;lt;&amp;lt; urg.what() &amp;lt;&amp;lt; endl;&lt;br /&gt;
		exit(1);&lt;br /&gt;
	}&lt;br /&gt;
	vector&amp;lt;long&amp;gt; data;&lt;br /&gt;
	long timestamp = 0;&lt;br /&gt;
	while (1)&lt;br /&gt;
	{&lt;br /&gt;
		int n = urg.capture(data, &amp;amp;timestamp);&lt;br /&gt;
		if (n &amp;lt; 0) {&lt;br /&gt;
			cout &amp;lt;&amp;lt; &amp;quot;UrgCtrl::capture: &amp;quot; &amp;lt;&amp;lt; urg.what() &amp;lt;&amp;lt; endl;&lt;br /&gt;
			exit(1);&lt;br /&gt;
		}&lt;br /&gt;
		cout &amp;lt;&amp;lt; &amp;quot;timestamp: &amp;quot; &amp;lt;&amp;lt; timestamp &amp;lt;&amp;lt; &amp;quot;\t range at 0 degree : &amp;quot; &amp;lt;&amp;lt; data[n/2] &amp;lt;&amp;lt; &amp;quot; mm&amp;quot; &amp;lt;&amp;lt;endl;&lt;br /&gt;
	}&lt;br /&gt;
	return 0;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Save it as &#039;&#039;hello.cpp&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
==Links==&lt;br /&gt;
* [http://www.hokuyo-aut.jp/02sensor/07scanner/download/urg_programs_en/ URG library homepage]&lt;br /&gt;
&lt;br /&gt;
[[Category:Robotics]]&lt;/div&gt;</summary>
		<author><name>OlivierR</name></author>
	</entry>
	<entry>
		<id>http://wikilegacy.armadeus.com/index.php?title=URG_laser&amp;diff=8404</id>
		<title>URG laser</title>
		<link rel="alternate" type="text/html" href="http://wikilegacy.armadeus.com/index.php?title=URG_laser&amp;diff=8404"/>
		<updated>2010-07-15T19:15:45Z</updated>

		<summary type="html">&lt;p&gt;OlivierR: /* Usage */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;How to drive Hoyuko&#039;s URG series laser sensors.&lt;br /&gt;
&lt;br /&gt;
==Installation==&lt;br /&gt;
&amp;lt;pre class=&amp;quot;host&amp;quot;&amp;gt;&lt;br /&gt;
$ make menuconfig&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;pre class=&amp;quot;config&amp;quot;&amp;gt;&lt;br /&gt;
Package Selection for the target  ---&amp;gt;&lt;br /&gt;
    Hardware handling / blockdevices and filesystem maintenance  ---&amp;gt;&lt;br /&gt;
        [*]   urg library&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;pre class=&amp;quot;host&amp;quot;&amp;gt;&lt;br /&gt;
$ make&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* reflash rootfs&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Usage==&lt;br /&gt;
&lt;br /&gt;
To use Hokoyu URG laser, you need Prolific pl2303 USB to serial adapter ( [[USB_to_serial_adapter | see here to install pl2303]]).&lt;br /&gt;
&lt;br /&gt;
Load the module and connect the URG laser to APF27 dev USB port. You should see something like this :&lt;br /&gt;
&amp;lt;pre class=&amp;quot;apf&amp;quot;&amp;gt;&lt;br /&gt;
# modprobe pl2303&lt;br /&gt;
usbcore: registered new interface driver usbserial&lt;br /&gt;
usbserial: USB Serial Driver core&lt;br /&gt;
USB Serial support registered for pl2303&lt;br /&gt;
usbcore: registered new interface driver pl2303&lt;br /&gt;
pl2303: Prolific PL2303 USB to serial adaptor driver&lt;br /&gt;
# usb 2-1: new full speed USB device using mxc-ehci and address 3&lt;br /&gt;
usb 2-1: device descriptor read/64, error -71&lt;br /&gt;
usb 2-1: New USB device found, idVendor=15d1, idProduct=0000&lt;br /&gt;
usb 2-1: New USB device strings: Mfr=1, Product=2, SerialNumber=0&lt;br /&gt;
usb 2-1: Product: URG-Series USB Driver&lt;br /&gt;
usb 2-1: Manufacturer: Hokuyo Data Flex for USB&lt;br /&gt;
usb 2-1: configuration #1 chosen from 1 choice&lt;br /&gt;
cdc_acm 2-1:1.0: ttyACM0: USB ACM device&lt;br /&gt;
# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Code example==&lt;br /&gt;
&lt;br /&gt;
==Links==&lt;br /&gt;
* [http://www.hokuyo-aut.jp/02sensor/07scanner/download/urg_programs_en/ URG library homepage]&lt;br /&gt;
&lt;br /&gt;
[[Category:Robotics]]&lt;/div&gt;</summary>
		<author><name>OlivierR</name></author>
	</entry>
	<entry>
		<id>http://wikilegacy.armadeus.com/index.php?title=URG_laser&amp;diff=8403</id>
		<title>URG laser</title>
		<link rel="alternate" type="text/html" href="http://wikilegacy.armadeus.com/index.php?title=URG_laser&amp;diff=8403"/>
		<updated>2010-07-15T19:15:30Z</updated>

		<summary type="html">&lt;p&gt;OlivierR: /* Usage */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;How to drive Hoyuko&#039;s URG series laser sensors.&lt;br /&gt;
&lt;br /&gt;
==Installation==&lt;br /&gt;
&amp;lt;pre class=&amp;quot;host&amp;quot;&amp;gt;&lt;br /&gt;
$ make menuconfig&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;pre class=&amp;quot;config&amp;quot;&amp;gt;&lt;br /&gt;
Package Selection for the target  ---&amp;gt;&lt;br /&gt;
    Hardware handling / blockdevices and filesystem maintenance  ---&amp;gt;&lt;br /&gt;
        [*]   urg library&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;pre class=&amp;quot;host&amp;quot;&amp;gt;&lt;br /&gt;
$ make&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* reflash rootfs&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Usage==&lt;br /&gt;
&lt;br /&gt;
To use Hokoyu URG laser, you need Prolific pl2303 USB to serial adapter ( [[USB_to_serial_adapter | see here to install pl2303]]).&lt;br /&gt;
Load the module and connect the URG laser to APF27 dev USB port. You should see something like this :&lt;br /&gt;
&amp;lt;pre class=&amp;quot;apf&amp;quot;&amp;gt;&lt;br /&gt;
# modprobe pl2303&lt;br /&gt;
usbcore: registered new interface driver usbserial&lt;br /&gt;
usbserial: USB Serial Driver core&lt;br /&gt;
USB Serial support registered for pl2303&lt;br /&gt;
usbcore: registered new interface driver pl2303&lt;br /&gt;
pl2303: Prolific PL2303 USB to serial adaptor driver&lt;br /&gt;
# usb 2-1: new full speed USB device using mxc-ehci and address 3&lt;br /&gt;
usb 2-1: device descriptor read/64, error -71&lt;br /&gt;
usb 2-1: New USB device found, idVendor=15d1, idProduct=0000&lt;br /&gt;
usb 2-1: New USB device strings: Mfr=1, Product=2, SerialNumber=0&lt;br /&gt;
usb 2-1: Product: URG-Series USB Driver&lt;br /&gt;
usb 2-1: Manufacturer: Hokuyo Data Flex for USB&lt;br /&gt;
usb 2-1: configuration #1 chosen from 1 choice&lt;br /&gt;
cdc_acm 2-1:1.0: ttyACM0: USB ACM device&lt;br /&gt;
# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Code example==&lt;br /&gt;
&lt;br /&gt;
==Links==&lt;br /&gt;
* [http://www.hokuyo-aut.jp/02sensor/07scanner/download/urg_programs_en/ URG library homepage]&lt;br /&gt;
&lt;br /&gt;
[[Category:Robotics]]&lt;/div&gt;</summary>
		<author><name>OlivierR</name></author>
	</entry>
	<entry>
		<id>http://wikilegacy.armadeus.com/index.php?title=URG_laser&amp;diff=8402</id>
		<title>URG laser</title>
		<link rel="alternate" type="text/html" href="http://wikilegacy.armadeus.com/index.php?title=URG_laser&amp;diff=8402"/>
		<updated>2010-07-15T19:14:28Z</updated>

		<summary type="html">&lt;p&gt;OlivierR: /* Usage */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;How to drive Hoyuko&#039;s URG series laser sensors.&lt;br /&gt;
&lt;br /&gt;
==Installation==&lt;br /&gt;
&amp;lt;pre class=&amp;quot;host&amp;quot;&amp;gt;&lt;br /&gt;
$ make menuconfig&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;pre class=&amp;quot;config&amp;quot;&amp;gt;&lt;br /&gt;
Package Selection for the target  ---&amp;gt;&lt;br /&gt;
    Hardware handling / blockdevices and filesystem maintenance  ---&amp;gt;&lt;br /&gt;
        [*]   urg library&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;pre class=&amp;quot;host&amp;quot;&amp;gt;&lt;br /&gt;
$ make&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* reflash rootfs&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Usage==&lt;br /&gt;
&lt;br /&gt;
To use Hokoyu URG laser, you need Prolific pl2303 USB to serial adapter ( [[USB_to_serial_adapter | see here to install pl2303]]).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre class=&amp;quot;apf&amp;quot;&amp;gt;&lt;br /&gt;
# modprobe pl2303&lt;br /&gt;
usbcore: registered new interface driver usbserial&lt;br /&gt;
usbserial: USB Serial Driver core&lt;br /&gt;
USB Serial support registered for pl2303&lt;br /&gt;
usbcore: registered new interface driver pl2303&lt;br /&gt;
pl2303: Prolific PL2303 USB to serial adaptor driver&lt;br /&gt;
# usb 2-1: new full speed USB device using mxc-ehci and address 3&lt;br /&gt;
usb 2-1: device descriptor read/64, error -71&lt;br /&gt;
usb 2-1: New USB device found, idVendor=15d1, idProduct=0000&lt;br /&gt;
usb 2-1: New USB device strings: Mfr=1, Product=2, SerialNumber=0&lt;br /&gt;
usb 2-1: Product: URG-Series USB Driver&lt;br /&gt;
usb 2-1: Manufacturer: Hokuyo Data Flex for USB&lt;br /&gt;
usb 2-1: configuration #1 chosen from 1 choice&lt;br /&gt;
cdc_acm 2-1:1.0: ttyACM0: USB ACM device&lt;br /&gt;
# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Code example==&lt;br /&gt;
&lt;br /&gt;
==Links==&lt;br /&gt;
* [http://www.hokuyo-aut.jp/02sensor/07scanner/download/urg_programs_en/ URG library homepage]&lt;br /&gt;
&lt;br /&gt;
[[Category:Robotics]]&lt;/div&gt;</summary>
		<author><name>OlivierR</name></author>
	</entry>
	<entry>
		<id>http://wikilegacy.armadeus.com/index.php?title=URG_laser&amp;diff=8401</id>
		<title>URG laser</title>
		<link rel="alternate" type="text/html" href="http://wikilegacy.armadeus.com/index.php?title=URG_laser&amp;diff=8401"/>
		<updated>2010-07-15T19:14:16Z</updated>

		<summary type="html">&lt;p&gt;OlivierR: /* Usage */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;How to drive Hoyuko&#039;s URG series laser sensors.&lt;br /&gt;
&lt;br /&gt;
==Installation==&lt;br /&gt;
&amp;lt;pre class=&amp;quot;host&amp;quot;&amp;gt;&lt;br /&gt;
$ make menuconfig&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;pre class=&amp;quot;config&amp;quot;&amp;gt;&lt;br /&gt;
Package Selection for the target  ---&amp;gt;&lt;br /&gt;
    Hardware handling / blockdevices and filesystem maintenance  ---&amp;gt;&lt;br /&gt;
        [*]   urg library&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;pre class=&amp;quot;host&amp;quot;&amp;gt;&lt;br /&gt;
$ make&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* reflash rootfs&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Usage==&lt;br /&gt;
&lt;br /&gt;
To use Hokoyu laser, you need Prolific pl2303 USB to serial adapter ( [[USB_to_serial_adapter | see here to install pl2303]]).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre class=&amp;quot;apf&amp;quot;&amp;gt;&lt;br /&gt;
# modprobe pl2303&lt;br /&gt;
usbcore: registered new interface driver usbserial&lt;br /&gt;
usbserial: USB Serial Driver core&lt;br /&gt;
USB Serial support registered for pl2303&lt;br /&gt;
usbcore: registered new interface driver pl2303&lt;br /&gt;
pl2303: Prolific PL2303 USB to serial adaptor driver&lt;br /&gt;
# usb 2-1: new full speed USB device using mxc-ehci and address 3&lt;br /&gt;
usb 2-1: device descriptor read/64, error -71&lt;br /&gt;
usb 2-1: New USB device found, idVendor=15d1, idProduct=0000&lt;br /&gt;
usb 2-1: New USB device strings: Mfr=1, Product=2, SerialNumber=0&lt;br /&gt;
usb 2-1: Product: URG-Series USB Driver&lt;br /&gt;
usb 2-1: Manufacturer: Hokuyo Data Flex for USB&lt;br /&gt;
usb 2-1: configuration #1 chosen from 1 choice&lt;br /&gt;
cdc_acm 2-1:1.0: ttyACM0: USB ACM device&lt;br /&gt;
# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Code example==&lt;br /&gt;
&lt;br /&gt;
==Links==&lt;br /&gt;
* [http://www.hokuyo-aut.jp/02sensor/07scanner/download/urg_programs_en/ URG library homepage]&lt;br /&gt;
&lt;br /&gt;
[[Category:Robotics]]&lt;/div&gt;</summary>
		<author><name>OlivierR</name></author>
	</entry>
	<entry>
		<id>http://wikilegacy.armadeus.com/index.php?title=URG_laser&amp;diff=8400</id>
		<title>URG laser</title>
		<link rel="alternate" type="text/html" href="http://wikilegacy.armadeus.com/index.php?title=URG_laser&amp;diff=8400"/>
		<updated>2010-07-15T19:11:18Z</updated>

		<summary type="html">&lt;p&gt;OlivierR: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;How to drive Hoyuko&#039;s URG series laser sensors.&lt;br /&gt;
&lt;br /&gt;
==Installation==&lt;br /&gt;
&amp;lt;pre class=&amp;quot;host&amp;quot;&amp;gt;&lt;br /&gt;
$ make menuconfig&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;pre class=&amp;quot;config&amp;quot;&amp;gt;&lt;br /&gt;
Package Selection for the target  ---&amp;gt;&lt;br /&gt;
    Hardware handling / blockdevices and filesystem maintenance  ---&amp;gt;&lt;br /&gt;
        [*]   urg library&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;pre class=&amp;quot;host&amp;quot;&amp;gt;&lt;br /&gt;
$ make&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* reflash rootfs&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Usage==&lt;br /&gt;
&lt;br /&gt;
To use Hokoyu laser, you need Prolific pl2303 USB to serial adapter ( [[USB_to_serial_adapter | see here to install pl2303]]).&lt;br /&gt;
&lt;br /&gt;
==Code example==&lt;br /&gt;
&lt;br /&gt;
==Links==&lt;br /&gt;
* [http://www.hokuyo-aut.jp/02sensor/07scanner/download/urg_programs_en/ URG library homepage]&lt;br /&gt;
&lt;br /&gt;
[[Category:Robotics]]&lt;/div&gt;</summary>
		<author><name>OlivierR</name></author>
	</entry>
	<entry>
		<id>http://wikilegacy.armadeus.com/index.php?title=User:OlivierR&amp;diff=8069</id>
		<title>User:OlivierR</title>
		<link rel="alternate" type="text/html" href="http://wikilegacy.armadeus.com/index.php?title=User:OlivierR&amp;diff=8069"/>
		<updated>2010-03-18T15:41:19Z</updated>

		<summary type="html">&lt;p&gt;OlivierR: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Bonjour,&lt;br /&gt;
Je suis enseignant-chercheur à l&#039;ENSIETA et je souhaite porter Armadeus dans le cursus d&#039;enseignement. &lt;br /&gt;
&lt;br /&gt;
== &#039;&#039;&#039;Mes compétences :&#039;&#039;&#039; ==&lt;br /&gt;
* Robotique&lt;br /&gt;
* Méthodes ensemblistes et calcul par intervalles&lt;br /&gt;
* Réseaux / Télécommuncations &lt;br /&gt;
* programmation en C/C++/Java/Python/Bash  &lt;br /&gt;
* GNU Linux Debian&lt;br /&gt;
&lt;br /&gt;
== &#039;&#039;&#039;Contributions :&#039;&#039;&#039; ==&lt;br /&gt;
* package Java pour faciliter la programmation Armadeus en Java et notamment l&#039;utilisation des périphériques&lt;/div&gt;</summary>
		<author><name>OlivierR</name></author>
	</entry>
	<entry>
		<id>http://wikilegacy.armadeus.com/index.php?title=PWM&amp;diff=7773</id>
		<title>PWM</title>
		<link rel="alternate" type="text/html" href="http://wikilegacy.armadeus.com/index.php?title=PWM&amp;diff=7773"/>
		<updated>2009-12-09T10:44:03Z</updated>

		<summary type="html">&lt;p&gt;OlivierR: remove java example as long as it is not clear for me !&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;On this page, you will find usefull informations to configure and use the Pulse Width Modulation (PWM) capabilities of your [[APF9328]]/[[APF27]] boards.&lt;br /&gt;
&lt;br /&gt;
The i.MX processor is capable of driving 2 PWM signals:&lt;br /&gt;
* one is linked to the LCD controller and allow to control the [[BackLight | LCD backlight]]&lt;br /&gt;
* the other can be used to generate a PWM signal in several mode:&lt;br /&gt;
** audio playback&lt;br /&gt;
** real PWM&lt;br /&gt;
&lt;br /&gt;
==Hardware==&lt;br /&gt;
i.MX PWM module is using &#039;&#039;PWMO&#039;&#039; (pin 2 of PortA on [[APF9328]] and pin 5 of PortE on the [[APF27]]) as ouput.&lt;br /&gt;
* On [[APF9328DevLight]] this pin is accessible from &#039;&#039;TIMER&#039;&#039; zone under the board (See [http://www.armadeus.com/_downloads/apf9328DevLight/documentation/dataSheet_APF9328_DevLight_V2.pdf datasheets for more infos)]&lt;br /&gt;
* On [[APF9328DevFull|APF9328DevFull development boards]] this pin is connected to pin 4 (TIM2) of &#039;&#039;&amp;quot;Timers&amp;quot;&#039;&#039; connector (X21)&lt;br /&gt;
* On [[APF27Dev|APF27Dev development boards]] this pin is connected to pin 4 of J22&lt;br /&gt;
&lt;br /&gt;
== Linux driver installation ==&lt;br /&gt;
i.MX PWM driver is installed by default in standard Armadeus rootfs.&lt;br /&gt;
&lt;br /&gt;
== Usage ==&lt;br /&gt;
* Load the module:&lt;br /&gt;
&amp;lt;pre class=&amp;quot;apf&amp;quot;&amp;gt;&lt;br /&gt;
 # modprobe imx-pwm&lt;br /&gt;
 Initializing PWM class.&lt;br /&gt;
  Initializing PWM#0...PWM major number = 251&lt;br /&gt;
 PWM driver v0.7&lt;br /&gt;
 done.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* If you plan to use sound, create &#039;&#039;/dev/pwm&#039;&#039; device file if not already existing (Major is dynamically allocated)&lt;br /&gt;
&amp;lt;pre class=&amp;quot;apf&amp;quot;&amp;gt;&lt;br /&gt;
 # DEV=`cat /proc/devices | grep imx-pwm | cut -d &amp;quot; &amp;quot; -f 1`; mknod /dev/pwm c $DEV 0&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== PWM Mode ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;strong&amp;gt;Remark:&amp;lt;/strong&amp;gt;&lt;br /&gt;
* The pwm has a resolution of 1uS&lt;br /&gt;
&lt;br /&gt;
After driver loading, you have access to &#039;&#039;/sys/class/pwm/...&#039;&#039; functionnalities:&lt;br /&gt;
* to change frequency (for example 500 Hz):&lt;br /&gt;
&amp;lt;pre class=&amp;quot;apf&amp;quot;&amp;gt;&lt;br /&gt;
 # echo 500 &amp;gt; /sys/class/pwm/pwm0/frequency&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* to change period (for example 100us):&lt;br /&gt;
&amp;lt;pre class=&amp;quot;apf&amp;quot;&amp;gt;&lt;br /&gt;
 # echo 100 &amp;gt; /sys/class/pwm/pwm0/period&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* to change duty cycle (for example 50.0%)&lt;br /&gt;
&amp;lt;pre class=&amp;quot;apf&amp;quot;&amp;gt;&lt;br /&gt;
 # echo 500 &amp;gt; /sys/class/pwm/pwm0/duty&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* to activate PWM:&lt;br /&gt;
&amp;lt;pre class=&amp;quot;apf&amp;quot;&amp;gt;&lt;br /&gt;
 # echo 1 &amp;gt; /sys/class/pwm/pwm0/active&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* to de-activate PWM:&lt;br /&gt;
&amp;lt;pre class=&amp;quot;apf&amp;quot;&amp;gt;&lt;br /&gt;
 # echo 0 &amp;gt; /sys/class/pwm/pwm0/active&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Bash test script ====&lt;br /&gt;
* A Bash test script is available given below. Just enter the desired frequency and duty cycle. &lt;br /&gt;
&amp;lt;source lang=&amp;quot;Bash&amp;quot;&amp;gt;&lt;br /&gt;
#!/bin/sh&lt;br /&gt;
#&lt;br /&gt;
# script to command imx pwm &lt;br /&gt;
# usage : pwm_imx frequency duty &lt;br /&gt;
#&lt;br /&gt;
&lt;br /&gt;
if [ $# -lt 2 ] &lt;br /&gt;
then&lt;br /&gt;
echo &amp;quot;Provide two arguments to this script !&amp;quot;&lt;br /&gt;
echo &amp;quot;pwm_imx frequency dutycycle&amp;quot;&lt;br /&gt;
exit 1&lt;br /&gt;
fi&lt;br /&gt;
&lt;br /&gt;
SYS_DIR=&amp;quot;/sys/class/pwm/pwm0/&amp;quot;&lt;br /&gt;
FREQUENCY=$1&lt;br /&gt;
DUTY=$2&lt;br /&gt;
&lt;br /&gt;
DUTY=`(echo $DUTY | awk &#039;{ print $1*10}&#039;)`&lt;br /&gt;
&lt;br /&gt;
if [ ! -d &amp;quot;$SYS_DIR&amp;quot; ]; then&lt;br /&gt;
echo &amp;quot;Can&#039;t find /sys/ interface for PWM&amp;quot;&lt;br /&gt;
exit 1&lt;br /&gt;
fi&lt;br /&gt;
&lt;br /&gt;
echo &amp;quot;Starting PWM&amp;quot;&lt;br /&gt;
echo 1 &amp;gt; $SYS_DIR/active&lt;br /&gt;
&lt;br /&gt;
#SET FREQUENCY&lt;br /&gt;
echo $FREQUENCY &amp;gt; $SYS_DIR/frequency&lt;br /&gt;
echo &amp;quot;Setting PWM to $FREQUENCY Hz&amp;quot;&lt;br /&gt;
&lt;br /&gt;
#SET DUTY CYCLE&lt;br /&gt;
echo $DUTY &amp;gt; $SYS_DIR/duty&lt;br /&gt;
echo &amp;quot;Setting DUTY to $2 %&amp;quot;&lt;br /&gt;
&lt;br /&gt;
exit 0&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Audio Mode ===&lt;br /&gt;
Audio playback mode is working since v0.5 of PWM driver (thanks to [[User:SebastienR|SebastienR]]).&lt;br /&gt;
You can play 8, 16 &amp;amp; 32 KHz 8bit linear RAW sound. It&#039;s recommended to play 8kHz one, as they use less CPU ressources.&lt;br /&gt;
To convert a sound to the right format we recommend to use SoX (on Linux).&lt;br /&gt;
For exemple:&lt;br /&gt;
 [host]$ sox /usr/share/sounds/KDE_Chimes_1.ogg -r 8192 -b -u -c 1 Chimes.raw&lt;br /&gt;
 -r -&amp;gt; sampling rate&lt;br /&gt;
 -b -&amp;gt; byte/8bit signal&lt;br /&gt;
 -u -&amp;gt; linear /not compressed&lt;br /&gt;
 -c 1 -&amp;gt; Mono / 1 channel&lt;br /&gt;
&lt;br /&gt;
Then you can test it using &#039;&#039;target/linux/modules/pwm/test/testplaymode&#039;&#039;, which can be compiled that way:&lt;br /&gt;
&amp;lt;pre class=&amp;quot;host&amp;quot;&amp;gt;&lt;br /&gt;
 $ make shell_env&lt;br /&gt;
 $ . armadeus_env.sh&lt;br /&gt;
 $ export PATH=$PATH:$ARMADEUS_TOOLCHAIN_PATH&lt;br /&gt;
 $ make -C target/linux/modules/pwm/test/&lt;br /&gt;
 $ cp target/linux/modules/pwm/test/testplaymode /tftpboot/&lt;br /&gt;
 $ cp target/linux/modules/pwm/test/KDE_Startup_2.raw /tftpboot/&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
on target do:&lt;br /&gt;
&amp;lt;pre class=&amp;quot;apf&amp;quot;&amp;gt;&lt;br /&gt;
 # testplaymode&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
or&lt;br /&gt;
&amp;lt;pre class=&amp;quot;apf&amp;quot;&amp;gt;&lt;br /&gt;
 # testplaymode KDE_Startup_2.raw&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Going further==&lt;br /&gt;
If you need more than one PWM at a time, you can use the APF&#039;s FPGA with [[MotionSystem|the following project]].&lt;br /&gt;
&lt;br /&gt;
== Links ==&lt;br /&gt;
* [http://sox.sourceforge.net/Docs/FAQ SoX, sound format converter]&lt;br /&gt;
* http://en.wikipedia.org/wiki/Pulse-width_modulation&lt;br /&gt;
&lt;br /&gt;
[[Category:Linux_drivers]]&lt;br /&gt;
[[Category:ExternalDeviceControl]]&lt;/div&gt;</summary>
		<author><name>OlivierR</name></author>
	</entry>
	<entry>
		<id>http://wikilegacy.armadeus.com/index.php?title=PWM&amp;diff=7436</id>
		<title>PWM</title>
		<link rel="alternate" type="text/html" href="http://wikilegacy.armadeus.com/index.php?title=PWM&amp;diff=7436"/>
		<updated>2009-10-05T08:30:50Z</updated>

		<summary type="html">&lt;p&gt;OlivierR: /* PWM with Java */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;On this page, you will find usefull informations to configure and use the Pulse Width Modulation (PWM) capabilities of your [[APF9328]]/[[APF27]] boards.&lt;br /&gt;
&lt;br /&gt;
The i.MX processor is capable of driving 2 PWM signals:&lt;br /&gt;
* one is linked to the LCD controller and allow to control the [[BackLight | LCD backlight]]&lt;br /&gt;
* the other can be used to generate a PWM signal in several mode:&lt;br /&gt;
** audio playback&lt;br /&gt;
** real PWM&lt;br /&gt;
&lt;br /&gt;
==Hardware==&lt;br /&gt;
i.MX PWM module is using &#039;&#039;PWMO&#039;&#039; (pin 2 of PortA on [[APF9328]] and pin 5 of PortE on the [[APF27]]) as ouput.&lt;br /&gt;
* On [[APF9328DevLight]] this pin is accessible from &#039;&#039;TIMER&#039;&#039; zone under the board (See [http://www.armadeus.com/_downloads/apf9328DevLight/documentation/dataSheet_APF9328_DevLight_V2.pdf datasheets for more infos)]&lt;br /&gt;
* On [[APF9328DevFull|APF9328DevFull development boards]] this pin is connected to pin 4 (TIM2) of &#039;&#039;&amp;quot;Timers&amp;quot;&#039;&#039; connector (X21)&lt;br /&gt;
* On [[APF27Dev|APF27Dev development boards]] this pin is connected to pin 4 of J22&lt;br /&gt;
&lt;br /&gt;
== Linux driver installation ==&lt;br /&gt;
i.MX PWM driver is installed by default in standard Armadeus rootfs.&lt;br /&gt;
&lt;br /&gt;
== Usage ==&lt;br /&gt;
* Load the module:&lt;br /&gt;
&amp;lt;pre class=&amp;quot;apf&amp;quot;&amp;gt;&lt;br /&gt;
 # modprobe imx-pwm&lt;br /&gt;
 Initializing PWM class.&lt;br /&gt;
  Initializing PWM#0...PWM major number = 251&lt;br /&gt;
 PWM driver v0.7&lt;br /&gt;
 done.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* If you plan to use sound, create &#039;&#039;/dev/pwm&#039;&#039; device file if not already existing (Major is dynamically allocated)&lt;br /&gt;
&amp;lt;pre class=&amp;quot;apf&amp;quot;&amp;gt;&lt;br /&gt;
 # DEV=`cat /proc/devices | grep imx-pwm | cut -d &amp;quot; &amp;quot; -f 1`; mknod /dev/pwm c $DEV 0&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== PWM Mode ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;strong&amp;gt;Remark:&amp;lt;/strong&amp;gt;&lt;br /&gt;
* The pwm has a resolution of 1uS&lt;br /&gt;
&lt;br /&gt;
After driver loading, you have access to &#039;&#039;/sys/class/pwm/...&#039;&#039; functionnalities:&lt;br /&gt;
* to change frequency (for example 500 Hz):&lt;br /&gt;
&amp;lt;pre class=&amp;quot;apf&amp;quot;&amp;gt;&lt;br /&gt;
 # echo 500 &amp;gt; /sys/class/pwm/pwm0/frequency&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* to change period (for example 100us):&lt;br /&gt;
&amp;lt;pre class=&amp;quot;apf&amp;quot;&amp;gt;&lt;br /&gt;
 # echo 100 &amp;gt; /sys/class/pwm/pwm0/period&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* to change duty cycle (for example 50.0%)&lt;br /&gt;
&amp;lt;pre class=&amp;quot;apf&amp;quot;&amp;gt;&lt;br /&gt;
 # echo 500 &amp;gt; /sys/class/pwm/pwm0/duty&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* to activate PWM:&lt;br /&gt;
&amp;lt;pre class=&amp;quot;apf&amp;quot;&amp;gt;&lt;br /&gt;
 # echo 1 &amp;gt; /sys/class/pwm/pwm0/active&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* to de-activate PWM:&lt;br /&gt;
&amp;lt;pre class=&amp;quot;apf&amp;quot;&amp;gt;&lt;br /&gt;
 # echo 0 &amp;gt; /sys/class/pwm/pwm0/active&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Bash test script ====&lt;br /&gt;
* A Bash test script is available given below. Just enter the desired frequency and duty cycle. &lt;br /&gt;
&amp;lt;source lang=&amp;quot;Bash&amp;quot;&amp;gt;&lt;br /&gt;
#!/bin/sh&lt;br /&gt;
#&lt;br /&gt;
# script to command imx pwm &lt;br /&gt;
# usage : pwm_imx frequency duty &lt;br /&gt;
#&lt;br /&gt;
&lt;br /&gt;
if [ $# -lt 2 ] &lt;br /&gt;
then&lt;br /&gt;
echo &amp;quot;Provide two arguments to this script !&amp;quot;&lt;br /&gt;
echo &amp;quot;pwm_imx frequency dutycycle&amp;quot;&lt;br /&gt;
exit 1&lt;br /&gt;
fi&lt;br /&gt;
&lt;br /&gt;
SYS_DIR=&amp;quot;/sys/class/pwm/pwm0/&amp;quot;&lt;br /&gt;
FREQUENCY=$1&lt;br /&gt;
DUTY=$2&lt;br /&gt;
&lt;br /&gt;
DUTY=`(echo $DUTY | awk &#039;{ print $1*10}&#039;)`&lt;br /&gt;
&lt;br /&gt;
if [ ! -d &amp;quot;$SYS_DIR&amp;quot; ]; then&lt;br /&gt;
echo &amp;quot;Can&#039;t find /sys/ interface for PWM&amp;quot;&lt;br /&gt;
exit 1&lt;br /&gt;
fi&lt;br /&gt;
&lt;br /&gt;
echo &amp;quot;Starting PWM&amp;quot;&lt;br /&gt;
echo 1 &amp;gt; $SYS_DIR/active&lt;br /&gt;
&lt;br /&gt;
#SET FREQUENCY&lt;br /&gt;
echo $FREQUENCY &amp;gt; $SYS_DIR/frequency&lt;br /&gt;
echo &amp;quot;Setting PWM to $FREQUENCY Hz&amp;quot;&lt;br /&gt;
&lt;br /&gt;
#SET DUTY CYCLE&lt;br /&gt;
echo $DUTY &amp;gt; $SYS_DIR/duty&lt;br /&gt;
echo &amp;quot;Setting DUTY to $2 %&amp;quot;&lt;br /&gt;
&lt;br /&gt;
exit 0&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== PWM with Java ====&lt;br /&gt;
&lt;br /&gt;
The code bellow shows how to directly use iMX-PWM from Java. The main method provides example of using it. PWM control is done by reading and writing pseudo-files in /sys/class/pwm/pwm0/ directory. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;Java&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
import java.io.*;&lt;br /&gt;
&lt;br /&gt;
public class Imxpwm {&lt;br /&gt;
&lt;br /&gt;
	private FileReader activeReader;&lt;br /&gt;
&lt;br /&gt;
	private FileWriter activeWriter;&lt;br /&gt;
&lt;br /&gt;
	private FileReader frequencyReader;&lt;br /&gt;
&lt;br /&gt;
	private FileWriter frequencyWriter;&lt;br /&gt;
&lt;br /&gt;
	private FileReader periodReader;&lt;br /&gt;
&lt;br /&gt;
	private FileWriter periodWriter;&lt;br /&gt;
&lt;br /&gt;
	private FileReader dutyReader;&lt;br /&gt;
&lt;br /&gt;
	private FileWriter dutyWriter;&lt;br /&gt;
&lt;br /&gt;
	public boolean isActive() {&lt;br /&gt;
		try {&lt;br /&gt;
			int result = this.activeReader.read();&lt;br /&gt;
			if (result == 0) {&lt;br /&gt;
				return false;&lt;br /&gt;
			} else {&lt;br /&gt;
				return true;&lt;br /&gt;
			}&lt;br /&gt;
		} catch (Exception e) {&lt;br /&gt;
			e.printStackTrace();&lt;br /&gt;
			return false;&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	public void setActive(boolean active) {&lt;br /&gt;
		try {&lt;br /&gt;
			if (active) {&lt;br /&gt;
				this.activeWriter.write(&amp;quot;1&amp;quot;);&lt;br /&gt;
				this.activeWriter.flush();&lt;br /&gt;
			} else {&lt;br /&gt;
				this.activeWriter.write(&amp;quot;0&amp;quot;);&lt;br /&gt;
				this.activeWriter.flush();&lt;br /&gt;
			}&lt;br /&gt;
		} catch (Exception e) {&lt;br /&gt;
			e.printStackTrace();&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	public double getDuty() {&lt;br /&gt;
		try {&lt;br /&gt;
			return this.dutyReader.read()/10.0;&lt;br /&gt;
		} catch (Exception e) {&lt;br /&gt;
			e.printStackTrace();&lt;br /&gt;
			return -1.0;&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	public void setDuty(double duty) {&lt;br /&gt;
		try {&lt;br /&gt;
			this.dutyWriter.write(Double.toString(duty * 10));&lt;br /&gt;
			this.dutyWriter.flush();&lt;br /&gt;
		} catch (Exception e) {&lt;br /&gt;
			e.printStackTrace();&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	public int getFrequency() {&lt;br /&gt;
		try {&lt;br /&gt;
			return this.frequencyReader.read();&lt;br /&gt;
		} catch (Exception e) {&lt;br /&gt;
			e.printStackTrace();&lt;br /&gt;
			return -1;&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	public void setFrequency(int frequency) {&lt;br /&gt;
		try {&lt;br /&gt;
			this.frequencyWriter.write(Integer.toString(frequency));&lt;br /&gt;
			this.frequencyWriter.flush();&lt;br /&gt;
		} catch (Exception e) {&lt;br /&gt;
			e.printStackTrace();&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	public int getPeriod() {&lt;br /&gt;
		try {&lt;br /&gt;
			return this.periodReader.read();&lt;br /&gt;
		} catch (Exception e) {&lt;br /&gt;
			e.printStackTrace();&lt;br /&gt;
			return -1;&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	public void setPeriod(int period) {&lt;br /&gt;
		try {&lt;br /&gt;
			// en µs&lt;br /&gt;
			this.periodWriter.write(Integer.toString(period));&lt;br /&gt;
			this.periodWriter.flush();&lt;br /&gt;
		} catch (Exception e) {&lt;br /&gt;
			e.printStackTrace();&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	/**&lt;br /&gt;
	 * @param frequency&lt;br /&gt;
	 * @param duty&lt;br /&gt;
	 * @param period&lt;br /&gt;
	 * @param active&lt;br /&gt;
	 */&lt;br /&gt;
	public Imxpwm(int frequency, int duty, boolean active) {&lt;br /&gt;
&lt;br /&gt;
		try {&lt;br /&gt;
			activeReader = new FileReader(&amp;quot;/sys/class/pwm/pwm0/active&amp;quot;);&lt;br /&gt;
		} catch (Exception e) {&lt;br /&gt;
			e.printStackTrace();&lt;br /&gt;
		}&lt;br /&gt;
		try {&lt;br /&gt;
			activeWriter = new FileWriter(&amp;quot;/sys/class/pwm/pwm0/active&amp;quot;);&lt;br /&gt;
		} catch (Exception e) {&lt;br /&gt;
			e.printStackTrace();&lt;br /&gt;
		}&lt;br /&gt;
		try {&lt;br /&gt;
			frequencyReader = new FileReader(&amp;quot;/sys/class/pwm/pwm0/frequency&amp;quot;);&lt;br /&gt;
		} catch (Exception e) {&lt;br /&gt;
			e.printStackTrace();&lt;br /&gt;
		}&lt;br /&gt;
		try {&lt;br /&gt;
			frequencyWriter = new FileWriter(&amp;quot;/sys/class/pwm/pwm0/frequency&amp;quot;);&lt;br /&gt;
		} catch (Exception e) {&lt;br /&gt;
			e.printStackTrace();&lt;br /&gt;
		}&lt;br /&gt;
		try {&lt;br /&gt;
			periodReader = new FileReader(&amp;quot;/sys/class/pwm/pwm0/period&amp;quot;);&lt;br /&gt;
		} catch (Exception e) {&lt;br /&gt;
			e.printStackTrace();&lt;br /&gt;
		}&lt;br /&gt;
		try {&lt;br /&gt;
			periodWriter = new FileWriter(&amp;quot;/sys/class/pwm/pwm0/period&amp;quot;);&lt;br /&gt;
		} catch (Exception e) {&lt;br /&gt;
			e.printStackTrace();&lt;br /&gt;
		}&lt;br /&gt;
		try {&lt;br /&gt;
			dutyReader = new FileReader(&amp;quot;/sys/class/pwm/pwm0/duty&amp;quot;);&lt;br /&gt;
		} catch (Exception e) {&lt;br /&gt;
			e.printStackTrace();&lt;br /&gt;
		}&lt;br /&gt;
		try {&lt;br /&gt;
			dutyWriter = new FileWriter(&amp;quot;/sys/class/pwm/pwm0/duty&amp;quot;);&lt;br /&gt;
		} catch (Exception e) {&lt;br /&gt;
			e.printStackTrace();&lt;br /&gt;
		}&lt;br /&gt;
		this.setActive(active);&lt;br /&gt;
		this.setDuty(duty);&lt;br /&gt;
		this.setFrequency(frequency);&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	public static void main(String[] args) throws Exception {&lt;br /&gt;
		Imxpwm maPWM = new Imxpwm(50, 75, true);&lt;br /&gt;
		double d = 0.0;&lt;br /&gt;
		for (int j = 0; j &amp;lt; 100; j++) {&lt;br /&gt;
			for (int i = 5; i &amp;lt;= 999; i++) {&lt;br /&gt;
				d = i * 1.0 / 10.0;&lt;br /&gt;
				maPWM.setDuty(d);&lt;br /&gt;
			}&lt;br /&gt;
		}&lt;br /&gt;
		maPWM.setFrequency(500);&lt;br /&gt;
		maPWM.setPeriod(50000);&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Audio Mode ===&lt;br /&gt;
Audio playback mode is working since v0.5 of PWM driver (thanks to [[User:SebastienR|SebastienR]]).&lt;br /&gt;
You can play 8, 16 &amp;amp; 32 KHz 8bit linear RAW sound. It&#039;s recommended to play 8kHz one, as they use less CPU ressources.&lt;br /&gt;
To convert a sound to the right format we recommend to use SoX (on Linux).&lt;br /&gt;
For exemple:&lt;br /&gt;
 [host]$ sox /usr/share/sounds/KDE_Chimes_1.ogg -r 8192 -b -u -c 1 Chimes.raw&lt;br /&gt;
 -r -&amp;gt; sampling rate&lt;br /&gt;
 -b -&amp;gt; byte/8bit signal&lt;br /&gt;
 -u -&amp;gt; linear /not compressed&lt;br /&gt;
 -c 1 -&amp;gt; Mono / 1 channel&lt;br /&gt;
&lt;br /&gt;
Then you can test it using &#039;&#039;target/linux/modules/pwm/test/testplaymode&#039;&#039;, which can be compiled that way:&lt;br /&gt;
&amp;lt;pre class=&amp;quot;host&amp;quot;&amp;gt;&lt;br /&gt;
 $ make shell_env&lt;br /&gt;
 $ . armadeus_env.sh&lt;br /&gt;
 $ export PATH=$PATH:$ARMADEUS_TOOLCHAIN_PATH&lt;br /&gt;
 $ make -C target/linux/modules/pwm/test/&lt;br /&gt;
 $ cp target/linux/modules/pwm/test/testplaymode /tftpboot/&lt;br /&gt;
 $ cp target/linux/modules/pwm/test/KDE_Startup_2.raw /tftpboot/&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
on target do:&lt;br /&gt;
&amp;lt;pre class=&amp;quot;apf&amp;quot;&amp;gt;&lt;br /&gt;
 # testplaymode&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
or&lt;br /&gt;
&amp;lt;pre class=&amp;quot;apf&amp;quot;&amp;gt;&lt;br /&gt;
 # testplaymode KDE_Startup_2.raw&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Going further==&lt;br /&gt;
If you need more than one PWM at a time, you can use the APF&#039;s FPGA with [[MotionSystem|the following project]].&lt;br /&gt;
&lt;br /&gt;
== Links ==&lt;br /&gt;
* [http://sox.sourceforge.net/Docs/FAQ SoX, sound format converter]&lt;br /&gt;
* http://en.wikipedia.org/wiki/Pulse-width_modulation&lt;br /&gt;
&lt;br /&gt;
[[Category:Linux_drivers]]&lt;br /&gt;
[[Category:ExternalDeviceControl]]&lt;/div&gt;</summary>
		<author><name>OlivierR</name></author>
	</entry>
	<entry>
		<id>http://wikilegacy.armadeus.com/index.php?title=PWM&amp;diff=7411</id>
		<title>PWM</title>
		<link rel="alternate" type="text/html" href="http://wikilegacy.armadeus.com/index.php?title=PWM&amp;diff=7411"/>
		<updated>2009-09-28T14:52:35Z</updated>

		<summary type="html">&lt;p&gt;OlivierR: /* PWM with Java */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;On this page, you will find usefull informations to configure and use the Pulse Width Modulation (PWM) capabilities of your [[APF9328]]/[[APF27]] boards.&lt;br /&gt;
&lt;br /&gt;
The i.MX processor is capable of driving 2 PWM signals:&lt;br /&gt;
* one is linked to the LCD controller and allow to control the [[BackLight | LCD backlight]]&lt;br /&gt;
* the other can be used to generate a PWM signal in several mode:&lt;br /&gt;
** audio playback&lt;br /&gt;
** real PWM&lt;br /&gt;
&lt;br /&gt;
==Hardware==&lt;br /&gt;
i.MX PWM module is using &#039;&#039;PWMO&#039;&#039; (pin 2 of PortA on [[APF9328]] and pin 5 of PortE on the [[APF27]]) as ouput.&lt;br /&gt;
* On [[APF9328DevLight]] this pin is accessible from &#039;&#039;TIMER&#039;&#039; zone under the board (See [http://www.armadeus.com/_downloads/apf9328DevLight/documentation/dataSheet_APF9328_DevLight_V2.pdf datasheets for more infos)]&lt;br /&gt;
* On [[APF9328DevFull|APF9328DevFull development boards]] this pin is connected to pin 4 (TIM2) of &#039;&#039;&amp;quot;Timers&amp;quot;&#039;&#039; connector (X21)&lt;br /&gt;
* On [[APF27Dev|APF27Dev development boards]] this pin is connected to pin 4 of J22&lt;br /&gt;
&lt;br /&gt;
== Linux driver installation ==&lt;br /&gt;
i.MX PWM driver is installed by default in standard Armadeus rootfs.&lt;br /&gt;
&lt;br /&gt;
== Usage ==&lt;br /&gt;
* Load the module:&lt;br /&gt;
&amp;lt;pre class=&amp;quot;apf&amp;quot;&amp;gt;&lt;br /&gt;
 # modprobe imx-pwm&lt;br /&gt;
 Initializing PWM class.&lt;br /&gt;
  Initializing PWM#0...PWM major number = 251&lt;br /&gt;
 PWM driver v0.7&lt;br /&gt;
 done.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* If you plan to use sound, create &#039;&#039;/dev/pwm&#039;&#039; device file if not already existing (Major is dynamically allocated)&lt;br /&gt;
&amp;lt;pre class=&amp;quot;apf&amp;quot;&amp;gt;&lt;br /&gt;
 # DEV=`cat /proc/devices | grep imx-pwm | cut -d &amp;quot; &amp;quot; -f 1`; mknod /dev/pwm c $DEV 0&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== PWM Mode ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;strong&amp;gt;Remark:&amp;lt;/strong&amp;gt;&lt;br /&gt;
* The pwm has a resolution of 1uS&lt;br /&gt;
&lt;br /&gt;
After driver loading, you have access to &#039;&#039;/sys/class/pwm/...&#039;&#039; functionnalities:&lt;br /&gt;
* to change frequency (for example 500 Hz):&lt;br /&gt;
&amp;lt;pre class=&amp;quot;apf&amp;quot;&amp;gt;&lt;br /&gt;
 # echo 500 &amp;gt; /sys/class/pwm/pwm0/frequency&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* to change period (for example 100us):&lt;br /&gt;
&amp;lt;pre class=&amp;quot;apf&amp;quot;&amp;gt;&lt;br /&gt;
 # echo 100 &amp;gt; /sys/class/pwm/pwm0/period&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* to change duty cycle (for example 50.0%)&lt;br /&gt;
&amp;lt;pre class=&amp;quot;apf&amp;quot;&amp;gt;&lt;br /&gt;
 # echo 500 &amp;gt; /sys/class/pwm/pwm0/duty&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* to activate PWM:&lt;br /&gt;
&amp;lt;pre class=&amp;quot;apf&amp;quot;&amp;gt;&lt;br /&gt;
 # echo 1 &amp;gt; /sys/class/pwm/pwm0/active&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* to de-activate PWM:&lt;br /&gt;
&amp;lt;pre class=&amp;quot;apf&amp;quot;&amp;gt;&lt;br /&gt;
 # echo 0 &amp;gt; /sys/class/pwm/pwm0/active&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Bash test script ====&lt;br /&gt;
* A Bash test script is available given below. Just enter the desired frequency and duty cycle. &lt;br /&gt;
&amp;lt;source lang=&amp;quot;Bash&amp;quot;&amp;gt;&lt;br /&gt;
#!/bin/sh&lt;br /&gt;
#&lt;br /&gt;
# script to command imx pwm &lt;br /&gt;
# usage : pwm_imx frequency duty &lt;br /&gt;
#&lt;br /&gt;
&lt;br /&gt;
if [ $# -lt 2 ] &lt;br /&gt;
then&lt;br /&gt;
echo &amp;quot;Provide two arguments to this script !&amp;quot;&lt;br /&gt;
echo &amp;quot;pwm_imx frequency dutycycle&amp;quot;&lt;br /&gt;
exit 1&lt;br /&gt;
fi&lt;br /&gt;
&lt;br /&gt;
SYS_DIR=&amp;quot;/sys/class/pwm/pwm0/&amp;quot;&lt;br /&gt;
FREQUENCY=$1&lt;br /&gt;
DUTY=$2&lt;br /&gt;
&lt;br /&gt;
DUTY=`(echo $DUTY | awk &#039;{ print $1*10}&#039;)`&lt;br /&gt;
&lt;br /&gt;
if [ ! -d &amp;quot;$SYS_DIR&amp;quot; ]; then&lt;br /&gt;
echo &amp;quot;Can&#039;t find /sys/ interface for PWM&amp;quot;&lt;br /&gt;
exit 1&lt;br /&gt;
fi&lt;br /&gt;
&lt;br /&gt;
echo &amp;quot;Starting PWM&amp;quot;&lt;br /&gt;
echo 1 &amp;gt; $SYS_DIR/active&lt;br /&gt;
&lt;br /&gt;
#SET FREQUENCY&lt;br /&gt;
echo $FREQUENCY &amp;gt; $SYS_DIR/frequency&lt;br /&gt;
echo &amp;quot;Setting PWM to $FREQUENCY Hz&amp;quot;&lt;br /&gt;
&lt;br /&gt;
#SET DUTY CYCLE&lt;br /&gt;
echo $DUTY &amp;gt; $SYS_DIR/duty&lt;br /&gt;
echo &amp;quot;Setting DUTY to $2 %&amp;quot;&lt;br /&gt;
&lt;br /&gt;
exit 0&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== PWM with Java ====&lt;br /&gt;
&lt;br /&gt;
The code bellow shows how to directly use iMX-PWM from Java. The main method provides example of using it. PWM control is done by reading and writing pseudo-files in /sys/class/pwm/pwm0/ directory. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;Java&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
import java.io.*;&lt;br /&gt;
&lt;br /&gt;
public class Imxpwm {&lt;br /&gt;
&lt;br /&gt;
	private FileReader activeReader;&lt;br /&gt;
&lt;br /&gt;
	private FileWriter activeWriter;&lt;br /&gt;
&lt;br /&gt;
	private FileReader frequencyReader;&lt;br /&gt;
&lt;br /&gt;
	private FileWriter frequencyWriter;&lt;br /&gt;
&lt;br /&gt;
	private FileReader periodReader;&lt;br /&gt;
&lt;br /&gt;
	private FileWriter periodWriter;&lt;br /&gt;
&lt;br /&gt;
	private FileReader dutyReader;&lt;br /&gt;
&lt;br /&gt;
	private FileWriter dutyWriter;&lt;br /&gt;
&lt;br /&gt;
	public boolean isActive() {&lt;br /&gt;
		try {&lt;br /&gt;
			int result = this.activeReader.read();&lt;br /&gt;
			if (result == 0) {&lt;br /&gt;
				return true;&lt;br /&gt;
			} else {&lt;br /&gt;
				return false;&lt;br /&gt;
			}&lt;br /&gt;
		} catch (Exception e) {&lt;br /&gt;
			e.printStackTrace();&lt;br /&gt;
			return false;&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	public void setActive(boolean active) {&lt;br /&gt;
		try {&lt;br /&gt;
			if (active) {&lt;br /&gt;
				this.activeWriter.write(&amp;quot;1&amp;quot;);&lt;br /&gt;
				this.activeWriter.flush();&lt;br /&gt;
			} else {&lt;br /&gt;
				this.activeWriter.write(&amp;quot;0&amp;quot;);&lt;br /&gt;
				this.activeWriter.flush();&lt;br /&gt;
			}&lt;br /&gt;
		} catch (Exception e) {&lt;br /&gt;
			e.printStackTrace();&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	public double getDuty() {&lt;br /&gt;
		try {&lt;br /&gt;
			return this.dutyReader.read()/10.0;&lt;br /&gt;
		} catch (Exception e) {&lt;br /&gt;
			e.printStackTrace();&lt;br /&gt;
			return -1.0;&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	public void setDuty(double duty) {&lt;br /&gt;
		try {&lt;br /&gt;
			this.dutyWriter.write(Double.toString(duty * 10));&lt;br /&gt;
			this.dutyWriter.flush();&lt;br /&gt;
		} catch (Exception e) {&lt;br /&gt;
			e.printStackTrace();&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	public int getFrequency() {&lt;br /&gt;
		try {&lt;br /&gt;
			return this.frequencyReader.read();&lt;br /&gt;
		} catch (Exception e) {&lt;br /&gt;
			e.printStackTrace();&lt;br /&gt;
			return -1;&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	public void setFrequency(int frequency) {&lt;br /&gt;
		try {&lt;br /&gt;
			this.frequencyWriter.write(Integer.toString(frequency));&lt;br /&gt;
			this.frequencyWriter.flush();&lt;br /&gt;
		} catch (Exception e) {&lt;br /&gt;
			e.printStackTrace();&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	public int getPeriod() {&lt;br /&gt;
		try {&lt;br /&gt;
			return this.periodReader.read();&lt;br /&gt;
		} catch (Exception e) {&lt;br /&gt;
			e.printStackTrace();&lt;br /&gt;
			return -1;&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	public void setPeriod(int period) {&lt;br /&gt;
		try {&lt;br /&gt;
			// en µs&lt;br /&gt;
			this.periodWriter.write(Integer.toString(period));&lt;br /&gt;
			this.periodWriter.flush();&lt;br /&gt;
		} catch (Exception e) {&lt;br /&gt;
			e.printStackTrace();&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	/**&lt;br /&gt;
	 * @param frequency&lt;br /&gt;
	 * @param duty&lt;br /&gt;
	 * @param period&lt;br /&gt;
	 * @param active&lt;br /&gt;
	 */&lt;br /&gt;
	public Imxpwm(int frequency, int duty, boolean active) {&lt;br /&gt;
&lt;br /&gt;
		try {&lt;br /&gt;
			activeReader = new FileReader(&amp;quot;/sys/class/pwm/pwm0/active&amp;quot;);&lt;br /&gt;
		} catch (Exception e) {&lt;br /&gt;
			e.printStackTrace();&lt;br /&gt;
		}&lt;br /&gt;
		try {&lt;br /&gt;
			activeWriter = new FileWriter(&amp;quot;/sys/class/pwm/pwm0/active&amp;quot;);&lt;br /&gt;
		} catch (Exception e) {&lt;br /&gt;
			e.printStackTrace();&lt;br /&gt;
		}&lt;br /&gt;
		try {&lt;br /&gt;
			frequencyReader = new FileReader(&amp;quot;/sys/class/pwm/pwm0/frequency&amp;quot;);&lt;br /&gt;
		} catch (Exception e) {&lt;br /&gt;
			e.printStackTrace();&lt;br /&gt;
		}&lt;br /&gt;
		try {&lt;br /&gt;
			frequencyWriter = new FileWriter(&amp;quot;/sys/class/pwm/pwm0/frequency&amp;quot;);&lt;br /&gt;
		} catch (Exception e) {&lt;br /&gt;
			e.printStackTrace();&lt;br /&gt;
		}&lt;br /&gt;
		try {&lt;br /&gt;
			periodReader = new FileReader(&amp;quot;/sys/class/pwm/pwm0/period&amp;quot;);&lt;br /&gt;
		} catch (Exception e) {&lt;br /&gt;
			e.printStackTrace();&lt;br /&gt;
		}&lt;br /&gt;
		try {&lt;br /&gt;
			periodWriter = new FileWriter(&amp;quot;/sys/class/pwm/pwm0/period&amp;quot;);&lt;br /&gt;
		} catch (Exception e) {&lt;br /&gt;
			e.printStackTrace();&lt;br /&gt;
		}&lt;br /&gt;
		try {&lt;br /&gt;
			dutyReader = new FileReader(&amp;quot;/sys/class/pwm/pwm0/duty&amp;quot;);&lt;br /&gt;
		} catch (Exception e) {&lt;br /&gt;
			e.printStackTrace();&lt;br /&gt;
		}&lt;br /&gt;
		try {&lt;br /&gt;
			dutyWriter = new FileWriter(&amp;quot;/sys/class/pwm/pwm0/duty&amp;quot;);&lt;br /&gt;
		} catch (Exception e) {&lt;br /&gt;
			e.printStackTrace();&lt;br /&gt;
		}&lt;br /&gt;
		this.setActive(active);&lt;br /&gt;
		this.setDuty(duty);&lt;br /&gt;
		this.setFrequency(frequency);&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	public static void main(String[] args) throws Exception {&lt;br /&gt;
		Imxpwm maPWM = new Imxpwm(50, 75, true);&lt;br /&gt;
		double d = 0.0;&lt;br /&gt;
		for (int j = 0; j &amp;lt; 100; j++) {&lt;br /&gt;
			for (int i = 5; i &amp;lt;= 999; i++) {&lt;br /&gt;
				d = i * 1.0 / 10.0;&lt;br /&gt;
				maPWM.setDuty(d);&lt;br /&gt;
			}&lt;br /&gt;
		}&lt;br /&gt;
		maPWM.setFrequency(500);&lt;br /&gt;
		maPWM.setPeriod(50000);&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Audio Mode ===&lt;br /&gt;
Audio playback mode is working since v0.5 of PWM driver (thanks to [[User:SebastienR|SebastienR]]).&lt;br /&gt;
You can play 8, 16 &amp;amp; 32 KHz 8bit linear RAW sound. It&#039;s recommended to play 8kHz one, as they use less CPU ressources.&lt;br /&gt;
To convert a sound to the right format we recommend to use SoX (on Linux).&lt;br /&gt;
For exemple:&lt;br /&gt;
 [host]$ sox /usr/share/sounds/KDE_Chimes_1.ogg -r 8192 -b -u -c 1 Chimes.raw&lt;br /&gt;
 -r -&amp;gt; sampling rate&lt;br /&gt;
 -b -&amp;gt; byte/8bit signal&lt;br /&gt;
 -u -&amp;gt; linear /not compressed&lt;br /&gt;
 -c 1 -&amp;gt; Mono / 1 channel&lt;br /&gt;
&lt;br /&gt;
Then you can test it using &#039;&#039;target/linux/modules/pwm/test/testplaymode&#039;&#039;, which can be compiled that way:&lt;br /&gt;
&amp;lt;pre class=&amp;quot;host&amp;quot;&amp;gt;&lt;br /&gt;
 $ make shell_env&lt;br /&gt;
 $ . armadeus_env.sh&lt;br /&gt;
 $ export PATH=$PATH:$ARMADEUS_TOOLCHAIN_PATH&lt;br /&gt;
 $ make -C target/linux/modules/pwm/test/&lt;br /&gt;
 $ cp target/linux/modules/pwm/test/testplaymode /tftpboot/&lt;br /&gt;
 $ cp target/linux/modules/pwm/test/KDE_Startup_2.raw /tftpboot/&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
on target do:&lt;br /&gt;
&amp;lt;pre class=&amp;quot;apf&amp;quot;&amp;gt;&lt;br /&gt;
 # testplaymode&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
or&lt;br /&gt;
&amp;lt;pre class=&amp;quot;apf&amp;quot;&amp;gt;&lt;br /&gt;
 # testplaymode KDE_Startup_2.raw&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Going further==&lt;br /&gt;
If you need more than one PWM at a time, you can use the APF&#039;s FPGA with [[MotionSystem|the following project]].&lt;br /&gt;
&lt;br /&gt;
== Links ==&lt;br /&gt;
* [http://sox.sourceforge.net/Docs/FAQ SoX, sound format converter]&lt;br /&gt;
* http://en.wikipedia.org/wiki/Pulse-width_modulation&lt;br /&gt;
&lt;br /&gt;
[[Category:Linux_drivers]]&lt;br /&gt;
[[Category:ExternalDeviceControl]]&lt;/div&gt;</summary>
		<author><name>OlivierR</name></author>
	</entry>
	<entry>
		<id>http://wikilegacy.armadeus.com/index.php?title=PWM&amp;diff=7410</id>
		<title>PWM</title>
		<link rel="alternate" type="text/html" href="http://wikilegacy.armadeus.com/index.php?title=PWM&amp;diff=7410"/>
		<updated>2009-09-28T14:50:59Z</updated>

		<summary type="html">&lt;p&gt;OlivierR: /* Bash test script */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;On this page, you will find usefull informations to configure and use the Pulse Width Modulation (PWM) capabilities of your [[APF9328]]/[[APF27]] boards.&lt;br /&gt;
&lt;br /&gt;
The i.MX processor is capable of driving 2 PWM signals:&lt;br /&gt;
* one is linked to the LCD controller and allow to control the [[BackLight | LCD backlight]]&lt;br /&gt;
* the other can be used to generate a PWM signal in several mode:&lt;br /&gt;
** audio playback&lt;br /&gt;
** real PWM&lt;br /&gt;
&lt;br /&gt;
==Hardware==&lt;br /&gt;
i.MX PWM module is using &#039;&#039;PWMO&#039;&#039; (pin 2 of PortA on [[APF9328]] and pin 5 of PortE on the [[APF27]]) as ouput.&lt;br /&gt;
* On [[APF9328DevLight]] this pin is accessible from &#039;&#039;TIMER&#039;&#039; zone under the board (See [http://www.armadeus.com/_downloads/apf9328DevLight/documentation/dataSheet_APF9328_DevLight_V2.pdf datasheets for more infos)]&lt;br /&gt;
* On [[APF9328DevFull|APF9328DevFull development boards]] this pin is connected to pin 4 (TIM2) of &#039;&#039;&amp;quot;Timers&amp;quot;&#039;&#039; connector (X21)&lt;br /&gt;
* On [[APF27Dev|APF27Dev development boards]] this pin is connected to pin 4 of J22&lt;br /&gt;
&lt;br /&gt;
== Linux driver installation ==&lt;br /&gt;
i.MX PWM driver is installed by default in standard Armadeus rootfs.&lt;br /&gt;
&lt;br /&gt;
== Usage ==&lt;br /&gt;
* Load the module:&lt;br /&gt;
&amp;lt;pre class=&amp;quot;apf&amp;quot;&amp;gt;&lt;br /&gt;
 # modprobe imx-pwm&lt;br /&gt;
 Initializing PWM class.&lt;br /&gt;
  Initializing PWM#0...PWM major number = 251&lt;br /&gt;
 PWM driver v0.7&lt;br /&gt;
 done.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* If you plan to use sound, create &#039;&#039;/dev/pwm&#039;&#039; device file if not already existing (Major is dynamically allocated)&lt;br /&gt;
&amp;lt;pre class=&amp;quot;apf&amp;quot;&amp;gt;&lt;br /&gt;
 # DEV=`cat /proc/devices | grep imx-pwm | cut -d &amp;quot; &amp;quot; -f 1`; mknod /dev/pwm c $DEV 0&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== PWM Mode ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;strong&amp;gt;Remark:&amp;lt;/strong&amp;gt;&lt;br /&gt;
* The pwm has a resolution of 1uS&lt;br /&gt;
&lt;br /&gt;
After driver loading, you have access to &#039;&#039;/sys/class/pwm/...&#039;&#039; functionnalities:&lt;br /&gt;
* to change frequency (for example 500 Hz):&lt;br /&gt;
&amp;lt;pre class=&amp;quot;apf&amp;quot;&amp;gt;&lt;br /&gt;
 # echo 500 &amp;gt; /sys/class/pwm/pwm0/frequency&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* to change period (for example 100us):&lt;br /&gt;
&amp;lt;pre class=&amp;quot;apf&amp;quot;&amp;gt;&lt;br /&gt;
 # echo 100 &amp;gt; /sys/class/pwm/pwm0/period&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* to change duty cycle (for example 50.0%)&lt;br /&gt;
&amp;lt;pre class=&amp;quot;apf&amp;quot;&amp;gt;&lt;br /&gt;
 # echo 500 &amp;gt; /sys/class/pwm/pwm0/duty&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* to activate PWM:&lt;br /&gt;
&amp;lt;pre class=&amp;quot;apf&amp;quot;&amp;gt;&lt;br /&gt;
 # echo 1 &amp;gt; /sys/class/pwm/pwm0/active&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* to de-activate PWM:&lt;br /&gt;
&amp;lt;pre class=&amp;quot;apf&amp;quot;&amp;gt;&lt;br /&gt;
 # echo 0 &amp;gt; /sys/class/pwm/pwm0/active&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Bash test script ====&lt;br /&gt;
* A Bash test script is available given below. Just enter the desired frequency and duty cycle. &lt;br /&gt;
&amp;lt;source lang=&amp;quot;Bash&amp;quot;&amp;gt;&lt;br /&gt;
#!/bin/sh&lt;br /&gt;
#&lt;br /&gt;
# script to command imx pwm &lt;br /&gt;
# usage : pwm_imx frequency duty &lt;br /&gt;
#&lt;br /&gt;
&lt;br /&gt;
if [ $# -lt 2 ] &lt;br /&gt;
then&lt;br /&gt;
echo &amp;quot;Provide two arguments to this script !&amp;quot;&lt;br /&gt;
echo &amp;quot;pwm_imx frequency dutycycle&amp;quot;&lt;br /&gt;
exit 1&lt;br /&gt;
fi&lt;br /&gt;
&lt;br /&gt;
SYS_DIR=&amp;quot;/sys/class/pwm/pwm0/&amp;quot;&lt;br /&gt;
FREQUENCY=$1&lt;br /&gt;
DUTY=$2&lt;br /&gt;
&lt;br /&gt;
DUTY=`(echo $DUTY | awk &#039;{ print $1*10}&#039;)`&lt;br /&gt;
&lt;br /&gt;
if [ ! -d &amp;quot;$SYS_DIR&amp;quot; ]; then&lt;br /&gt;
echo &amp;quot;Can&#039;t find /sys/ interface for PWM&amp;quot;&lt;br /&gt;
exit 1&lt;br /&gt;
fi&lt;br /&gt;
&lt;br /&gt;
echo &amp;quot;Starting PWM&amp;quot;&lt;br /&gt;
echo 1 &amp;gt; $SYS_DIR/active&lt;br /&gt;
&lt;br /&gt;
#SET FREQUENCY&lt;br /&gt;
echo $FREQUENCY &amp;gt; $SYS_DIR/frequency&lt;br /&gt;
echo &amp;quot;Setting PWM to $FREQUENCY Hz&amp;quot;&lt;br /&gt;
&lt;br /&gt;
#SET DUTY CYCLE&lt;br /&gt;
echo $DUTY &amp;gt; $SYS_DIR/duty&lt;br /&gt;
echo &amp;quot;Setting DUTY to $2 %&amp;quot;&lt;br /&gt;
&lt;br /&gt;
exit 0&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== PWM with Java ====&lt;br /&gt;
&lt;br /&gt;
The code bellow shows how to directly use iMX-PWM from Java. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;Java&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
import java.io.*;&lt;br /&gt;
&lt;br /&gt;
public class Imxpwm {&lt;br /&gt;
&lt;br /&gt;
	private FileReader activeReader;&lt;br /&gt;
&lt;br /&gt;
	private FileWriter activeWriter;&lt;br /&gt;
&lt;br /&gt;
	private FileReader frequencyReader;&lt;br /&gt;
&lt;br /&gt;
	private FileWriter frequencyWriter;&lt;br /&gt;
&lt;br /&gt;
	private FileReader periodReader;&lt;br /&gt;
&lt;br /&gt;
	private FileWriter periodWriter;&lt;br /&gt;
&lt;br /&gt;
	private FileReader dutyReader;&lt;br /&gt;
&lt;br /&gt;
	private FileWriter dutyWriter;&lt;br /&gt;
&lt;br /&gt;
	public boolean isActive() {&lt;br /&gt;
		try {&lt;br /&gt;
			int result = this.activeReader.read();&lt;br /&gt;
			if (result == 0) {&lt;br /&gt;
				return true;&lt;br /&gt;
			} else {&lt;br /&gt;
				return false;&lt;br /&gt;
			}&lt;br /&gt;
		} catch (Exception e) {&lt;br /&gt;
			e.printStackTrace();&lt;br /&gt;
			return false;&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	public void setActive(boolean active) {&lt;br /&gt;
		try {&lt;br /&gt;
			if (active) {&lt;br /&gt;
				this.activeWriter.write(&amp;quot;1&amp;quot;);&lt;br /&gt;
				this.activeWriter.flush();&lt;br /&gt;
			} else {&lt;br /&gt;
				this.activeWriter.write(&amp;quot;0&amp;quot;);&lt;br /&gt;
				this.activeWriter.flush();&lt;br /&gt;
			}&lt;br /&gt;
		} catch (Exception e) {&lt;br /&gt;
			e.printStackTrace();&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	public double getDuty() {&lt;br /&gt;
		try {&lt;br /&gt;
			return this.dutyReader.read()/10.0;&lt;br /&gt;
		} catch (Exception e) {&lt;br /&gt;
			e.printStackTrace();&lt;br /&gt;
			return -1.0;&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	public void setDuty(double duty) {&lt;br /&gt;
		try {&lt;br /&gt;
			this.dutyWriter.write(Double.toString(duty * 10));&lt;br /&gt;
			this.dutyWriter.flush();&lt;br /&gt;
		} catch (Exception e) {&lt;br /&gt;
			e.printStackTrace();&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	public int getFrequency() {&lt;br /&gt;
		try {&lt;br /&gt;
			return this.frequencyReader.read();&lt;br /&gt;
		} catch (Exception e) {&lt;br /&gt;
			e.printStackTrace();&lt;br /&gt;
			return -1;&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	public void setFrequency(int frequency) {&lt;br /&gt;
		try {&lt;br /&gt;
			this.frequencyWriter.write(Integer.toString(frequency));&lt;br /&gt;
			this.frequencyWriter.flush();&lt;br /&gt;
		} catch (Exception e) {&lt;br /&gt;
			e.printStackTrace();&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	public int getPeriod() {&lt;br /&gt;
		try {&lt;br /&gt;
			return this.periodReader.read();&lt;br /&gt;
		} catch (Exception e) {&lt;br /&gt;
			e.printStackTrace();&lt;br /&gt;
			return -1;&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	public void setPeriod(int period) {&lt;br /&gt;
		try {&lt;br /&gt;
			// en µs&lt;br /&gt;
			this.periodWriter.write(Integer.toString(period));&lt;br /&gt;
			this.periodWriter.flush();&lt;br /&gt;
		} catch (Exception e) {&lt;br /&gt;
			e.printStackTrace();&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	/**&lt;br /&gt;
	 * @param frequency&lt;br /&gt;
	 * @param duty&lt;br /&gt;
	 * @param period&lt;br /&gt;
	 * @param active&lt;br /&gt;
	 */&lt;br /&gt;
	public Imxpwm(int frequency, int duty, boolean active) {&lt;br /&gt;
&lt;br /&gt;
		try {&lt;br /&gt;
			activeReader = new FileReader(&amp;quot;/sys/class/pwm/pwm0/active&amp;quot;);&lt;br /&gt;
		} catch (Exception e) {&lt;br /&gt;
			e.printStackTrace();&lt;br /&gt;
		}&lt;br /&gt;
		try {&lt;br /&gt;
			activeWriter = new FileWriter(&amp;quot;/sys/class/pwm/pwm0/active&amp;quot;);&lt;br /&gt;
		} catch (Exception e) {&lt;br /&gt;
			e.printStackTrace();&lt;br /&gt;
		}&lt;br /&gt;
		try {&lt;br /&gt;
			frequencyReader = new FileReader(&amp;quot;/sys/class/pwm/pwm0/frequency&amp;quot;);&lt;br /&gt;
		} catch (Exception e) {&lt;br /&gt;
			e.printStackTrace();&lt;br /&gt;
		}&lt;br /&gt;
		try {&lt;br /&gt;
			frequencyWriter = new FileWriter(&amp;quot;/sys/class/pwm/pwm0/frequency&amp;quot;);&lt;br /&gt;
		} catch (Exception e) {&lt;br /&gt;
			e.printStackTrace();&lt;br /&gt;
		}&lt;br /&gt;
		try {&lt;br /&gt;
			periodReader = new FileReader(&amp;quot;/sys/class/pwm/pwm0/period&amp;quot;);&lt;br /&gt;
		} catch (Exception e) {&lt;br /&gt;
			e.printStackTrace();&lt;br /&gt;
		}&lt;br /&gt;
		try {&lt;br /&gt;
			periodWriter = new FileWriter(&amp;quot;/sys/class/pwm/pwm0/period&amp;quot;);&lt;br /&gt;
		} catch (Exception e) {&lt;br /&gt;
			e.printStackTrace();&lt;br /&gt;
		}&lt;br /&gt;
		try {&lt;br /&gt;
			dutyReader = new FileReader(&amp;quot;/sys/class/pwm/pwm0/duty&amp;quot;);&lt;br /&gt;
		} catch (Exception e) {&lt;br /&gt;
			e.printStackTrace();&lt;br /&gt;
		}&lt;br /&gt;
		try {&lt;br /&gt;
			dutyWriter = new FileWriter(&amp;quot;/sys/class/pwm/pwm0/duty&amp;quot;);&lt;br /&gt;
		} catch (Exception e) {&lt;br /&gt;
			e.printStackTrace();&lt;br /&gt;
		}&lt;br /&gt;
		this.setActive(active);&lt;br /&gt;
		this.setDuty(duty);&lt;br /&gt;
		this.setFrequency(frequency);&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	public static void main(String[] args) throws Exception {&lt;br /&gt;
		Imxpwm maPWM = new Imxpwm(50, 75, true);&lt;br /&gt;
		double d = 0.0;&lt;br /&gt;
		for (int j = 0; j &amp;lt; 100; j++) {&lt;br /&gt;
			for (int i = 5; i &amp;lt;= 999; i++) {&lt;br /&gt;
				d = i * 1.0 / 10.0;&lt;br /&gt;
				maPWM.setDuty(d);&lt;br /&gt;
			}&lt;br /&gt;
		}&lt;br /&gt;
		maPWM.setFrequency(500);&lt;br /&gt;
		maPWM.setPeriod(50000);&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Audio Mode ===&lt;br /&gt;
Audio playback mode is working since v0.5 of PWM driver (thanks to [[User:SebastienR|SebastienR]]).&lt;br /&gt;
You can play 8, 16 &amp;amp; 32 KHz 8bit linear RAW sound. It&#039;s recommended to play 8kHz one, as they use less CPU ressources.&lt;br /&gt;
To convert a sound to the right format we recommend to use SoX (on Linux).&lt;br /&gt;
For exemple:&lt;br /&gt;
 [host]$ sox /usr/share/sounds/KDE_Chimes_1.ogg -r 8192 -b -u -c 1 Chimes.raw&lt;br /&gt;
 -r -&amp;gt; sampling rate&lt;br /&gt;
 -b -&amp;gt; byte/8bit signal&lt;br /&gt;
 -u -&amp;gt; linear /not compressed&lt;br /&gt;
 -c 1 -&amp;gt; Mono / 1 channel&lt;br /&gt;
&lt;br /&gt;
Then you can test it using &#039;&#039;target/linux/modules/pwm/test/testplaymode&#039;&#039;, which can be compiled that way:&lt;br /&gt;
&amp;lt;pre class=&amp;quot;host&amp;quot;&amp;gt;&lt;br /&gt;
 $ make shell_env&lt;br /&gt;
 $ . armadeus_env.sh&lt;br /&gt;
 $ export PATH=$PATH:$ARMADEUS_TOOLCHAIN_PATH&lt;br /&gt;
 $ make -C target/linux/modules/pwm/test/&lt;br /&gt;
 $ cp target/linux/modules/pwm/test/testplaymode /tftpboot/&lt;br /&gt;
 $ cp target/linux/modules/pwm/test/KDE_Startup_2.raw /tftpboot/&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
on target do:&lt;br /&gt;
&amp;lt;pre class=&amp;quot;apf&amp;quot;&amp;gt;&lt;br /&gt;
 # testplaymode&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
or&lt;br /&gt;
&amp;lt;pre class=&amp;quot;apf&amp;quot;&amp;gt;&lt;br /&gt;
 # testplaymode KDE_Startup_2.raw&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Going further==&lt;br /&gt;
If you need more than one PWM at a time, you can use the APF&#039;s FPGA with [[MotionSystem|the following project]].&lt;br /&gt;
&lt;br /&gt;
== Links ==&lt;br /&gt;
* [http://sox.sourceforge.net/Docs/FAQ SoX, sound format converter]&lt;br /&gt;
* http://en.wikipedia.org/wiki/Pulse-width_modulation&lt;br /&gt;
&lt;br /&gt;
[[Category:Linux_drivers]]&lt;br /&gt;
[[Category:ExternalDeviceControl]]&lt;/div&gt;</summary>
		<author><name>OlivierR</name></author>
	</entry>
	<entry>
		<id>http://wikilegacy.armadeus.com/index.php?title=PWM&amp;diff=7408</id>
		<title>PWM</title>
		<link rel="alternate" type="text/html" href="http://wikilegacy.armadeus.com/index.php?title=PWM&amp;diff=7408"/>
		<updated>2009-09-27T18:45:12Z</updated>

		<summary type="html">&lt;p&gt;OlivierR: /* PWM with Java */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;On this page, you will find usefull informations to configure and use the Pulse Width Modulation (PWM) capabilities of your [[APF9328]]/[[APF27]] boards.&lt;br /&gt;
&lt;br /&gt;
The i.MX processor is capable of driving 2 PWM signals:&lt;br /&gt;
* one is linked to the LCD controller and allow to control the [[BackLight | LCD backlight]]&lt;br /&gt;
* the other can be used to generate a PWM signal in several mode:&lt;br /&gt;
** audio playback&lt;br /&gt;
** real PWM&lt;br /&gt;
&lt;br /&gt;
==Hardware==&lt;br /&gt;
i.MX PWM module is using &#039;&#039;PWMO&#039;&#039; (pin 2 of PortA on [[APF9328]] and pin 5 of PortE on the [[APF27]]) as ouput.&lt;br /&gt;
* On [[APF9328DevLight]] this pin is accessible from &#039;&#039;TIMER&#039;&#039; zone under the board (See [http://www.armadeus.com/_downloads/apf9328DevLight/documentation/dataSheet_APF9328_DevLight_V2.pdf datasheets for more infos)]&lt;br /&gt;
* On [[APF9328DevFull|APF9328DevFull development boards]] this pin is connected to pin 4 (TIM2) of &#039;&#039;&amp;quot;Timers&amp;quot;&#039;&#039; connector (X21)&lt;br /&gt;
* On [[APF27Dev|APF27Dev development boards]] this pin is connected to pin 4 of J22&lt;br /&gt;
&lt;br /&gt;
== Linux driver installation ==&lt;br /&gt;
i.MX PWM driver is installed by default in standard Armadeus rootfs.&lt;br /&gt;
&lt;br /&gt;
== Usage ==&lt;br /&gt;
* Load the module:&lt;br /&gt;
&amp;lt;pre class=&amp;quot;apf&amp;quot;&amp;gt;&lt;br /&gt;
 # modprobe imx-pwm&lt;br /&gt;
 Initializing PWM class.&lt;br /&gt;
  Initializing PWM#0...PWM major number = 251&lt;br /&gt;
 PWM driver v0.7&lt;br /&gt;
 done.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* If you plan to use sound, create &#039;&#039;/dev/pwm&#039;&#039; device file if not already existing (Major is dynamically allocated)&lt;br /&gt;
&amp;lt;pre class=&amp;quot;apf&amp;quot;&amp;gt;&lt;br /&gt;
 # DEV=`cat /proc/devices | grep imx-pwm | cut -d &amp;quot; &amp;quot; -f 1`; mknod /dev/pwm c $DEV 0&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== PWM Mode ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;strong&amp;gt;Remark:&amp;lt;/strong&amp;gt;&lt;br /&gt;
* The pwm has a resolution of 1uS&lt;br /&gt;
&lt;br /&gt;
After driver loading, you have access to &#039;&#039;/sys/class/pwm/...&#039;&#039; functionnalities:&lt;br /&gt;
* to change frequency (for example 500 Hz):&lt;br /&gt;
&amp;lt;pre class=&amp;quot;apf&amp;quot;&amp;gt;&lt;br /&gt;
 # echo 500 &amp;gt; /sys/class/pwm/pwm0/frequency&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* to change period (for example 100us):&lt;br /&gt;
&amp;lt;pre class=&amp;quot;apf&amp;quot;&amp;gt;&lt;br /&gt;
 # echo 100 &amp;gt; /sys/class/pwm/pwm0/period&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* to change duty cycle (for example 50.0%)&lt;br /&gt;
&amp;lt;pre class=&amp;quot;apf&amp;quot;&amp;gt;&lt;br /&gt;
 # echo 500 &amp;gt; /sys/class/pwm/pwm0/duty&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* to activate PWM:&lt;br /&gt;
&amp;lt;pre class=&amp;quot;apf&amp;quot;&amp;gt;&lt;br /&gt;
 # echo 1 &amp;gt; /sys/class/pwm/pwm0/active&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* to de-activate PWM:&lt;br /&gt;
&amp;lt;pre class=&amp;quot;apf&amp;quot;&amp;gt;&lt;br /&gt;
 # echo 0 &amp;gt; /sys/class/pwm/pwm0/active&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Bash test script ====&lt;br /&gt;
* A Bash test script is available given here :&lt;br /&gt;
&amp;lt;source lang=&amp;quot;Bash&amp;quot;&amp;gt;&lt;br /&gt;
#!/bin/sh&lt;br /&gt;
#&lt;br /&gt;
# script to command imx pwm &lt;br /&gt;
# usage : pwm_imx frequency duty &lt;br /&gt;
#&lt;br /&gt;
&lt;br /&gt;
if [ $# -lt 2 ] &lt;br /&gt;
then&lt;br /&gt;
echo &amp;quot;Provide two arguments to this script !&amp;quot;&lt;br /&gt;
echo &amp;quot;pwm_imx frequency dutycycle&amp;quot;&lt;br /&gt;
exit 1&lt;br /&gt;
fi&lt;br /&gt;
&lt;br /&gt;
SYS_DIR=&amp;quot;/sys/class/pwm/pwm0/&amp;quot;&lt;br /&gt;
FREQUENCY=$1&lt;br /&gt;
DUTY=$2&lt;br /&gt;
&lt;br /&gt;
DUTY=`(echo $DUTY | awk &#039;{ print $1*10}&#039;)`&lt;br /&gt;
&lt;br /&gt;
if [ ! -d &amp;quot;$SYS_DIR&amp;quot; ]; then&lt;br /&gt;
echo &amp;quot;Can&#039;t find /sys/ interface for PWM&amp;quot;&lt;br /&gt;
exit 1&lt;br /&gt;
fi&lt;br /&gt;
&lt;br /&gt;
echo &amp;quot;Starting PWM&amp;quot;&lt;br /&gt;
echo 1 &amp;gt; $SYS_DIR/active&lt;br /&gt;
&lt;br /&gt;
#SET FREQUENCY&lt;br /&gt;
echo $FREQUENCY &amp;gt; $SYS_DIR/frequency&lt;br /&gt;
echo &amp;quot;Setting PWM to $FREQUENCY Hz&amp;quot;&lt;br /&gt;
&lt;br /&gt;
#SET DUTY CYCLE&lt;br /&gt;
echo $DUTY &amp;gt; $SYS_DIR/duty&lt;br /&gt;
echo &amp;quot;Setting DUTY to $2 %&amp;quot;&lt;br /&gt;
&lt;br /&gt;
exit 0&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== PWM with Java ====&lt;br /&gt;
&lt;br /&gt;
The code bellow shows how to directly use iMX-PWM from Java. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;Java&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
import java.io.*;&lt;br /&gt;
&lt;br /&gt;
public class Imxpwm {&lt;br /&gt;
&lt;br /&gt;
	private FileReader activeReader;&lt;br /&gt;
&lt;br /&gt;
	private FileWriter activeWriter;&lt;br /&gt;
&lt;br /&gt;
	private FileReader frequencyReader;&lt;br /&gt;
&lt;br /&gt;
	private FileWriter frequencyWriter;&lt;br /&gt;
&lt;br /&gt;
	private FileReader periodReader;&lt;br /&gt;
&lt;br /&gt;
	private FileWriter periodWriter;&lt;br /&gt;
&lt;br /&gt;
	private FileReader dutyReader;&lt;br /&gt;
&lt;br /&gt;
	private FileWriter dutyWriter;&lt;br /&gt;
&lt;br /&gt;
	public boolean isActive() {&lt;br /&gt;
		try {&lt;br /&gt;
			int result = this.activeReader.read();&lt;br /&gt;
			if (result == 0) {&lt;br /&gt;
				return true;&lt;br /&gt;
			} else {&lt;br /&gt;
				return false;&lt;br /&gt;
			}&lt;br /&gt;
		} catch (Exception e) {&lt;br /&gt;
			e.printStackTrace();&lt;br /&gt;
			return false;&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	public void setActive(boolean active) {&lt;br /&gt;
		try {&lt;br /&gt;
			if (active) {&lt;br /&gt;
				this.activeWriter.write(&amp;quot;1&amp;quot;);&lt;br /&gt;
				this.activeWriter.flush();&lt;br /&gt;
			} else {&lt;br /&gt;
				this.activeWriter.write(&amp;quot;0&amp;quot;);&lt;br /&gt;
				this.activeWriter.flush();&lt;br /&gt;
			}&lt;br /&gt;
		} catch (Exception e) {&lt;br /&gt;
			e.printStackTrace();&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	public double getDuty() {&lt;br /&gt;
		try {&lt;br /&gt;
			return this.dutyReader.read()/10.0;&lt;br /&gt;
		} catch (Exception e) {&lt;br /&gt;
			e.printStackTrace();&lt;br /&gt;
			return -1.0;&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	public void setDuty(double duty) {&lt;br /&gt;
		try {&lt;br /&gt;
			this.dutyWriter.write(Double.toString(duty * 10));&lt;br /&gt;
			this.dutyWriter.flush();&lt;br /&gt;
		} catch (Exception e) {&lt;br /&gt;
			e.printStackTrace();&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	public int getFrequency() {&lt;br /&gt;
		try {&lt;br /&gt;
			return this.frequencyReader.read();&lt;br /&gt;
		} catch (Exception e) {&lt;br /&gt;
			e.printStackTrace();&lt;br /&gt;
			return -1;&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	public void setFrequency(int frequency) {&lt;br /&gt;
		try {&lt;br /&gt;
			this.frequencyWriter.write(Integer.toString(frequency));&lt;br /&gt;
			this.frequencyWriter.flush();&lt;br /&gt;
		} catch (Exception e) {&lt;br /&gt;
			e.printStackTrace();&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	public int getPeriod() {&lt;br /&gt;
		try {&lt;br /&gt;
			return this.periodReader.read();&lt;br /&gt;
		} catch (Exception e) {&lt;br /&gt;
			e.printStackTrace();&lt;br /&gt;
			return -1;&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	public void setPeriod(int period) {&lt;br /&gt;
		try {&lt;br /&gt;
			// en µs&lt;br /&gt;
			this.periodWriter.write(Integer.toString(period));&lt;br /&gt;
			this.periodWriter.flush();&lt;br /&gt;
		} catch (Exception e) {&lt;br /&gt;
			e.printStackTrace();&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	/**&lt;br /&gt;
	 * @param frequency&lt;br /&gt;
	 * @param duty&lt;br /&gt;
	 * @param period&lt;br /&gt;
	 * @param active&lt;br /&gt;
	 */&lt;br /&gt;
	public Imxpwm(int frequency, int duty, boolean active) {&lt;br /&gt;
&lt;br /&gt;
		try {&lt;br /&gt;
			activeReader = new FileReader(&amp;quot;/sys/class/pwm/pwm0/active&amp;quot;);&lt;br /&gt;
		} catch (Exception e) {&lt;br /&gt;
			e.printStackTrace();&lt;br /&gt;
		}&lt;br /&gt;
		try {&lt;br /&gt;
			activeWriter = new FileWriter(&amp;quot;/sys/class/pwm/pwm0/active&amp;quot;);&lt;br /&gt;
		} catch (Exception e) {&lt;br /&gt;
			e.printStackTrace();&lt;br /&gt;
		}&lt;br /&gt;
		try {&lt;br /&gt;
			frequencyReader = new FileReader(&amp;quot;/sys/class/pwm/pwm0/frequency&amp;quot;);&lt;br /&gt;
		} catch (Exception e) {&lt;br /&gt;
			e.printStackTrace();&lt;br /&gt;
		}&lt;br /&gt;
		try {&lt;br /&gt;
			frequencyWriter = new FileWriter(&amp;quot;/sys/class/pwm/pwm0/frequency&amp;quot;);&lt;br /&gt;
		} catch (Exception e) {&lt;br /&gt;
			e.printStackTrace();&lt;br /&gt;
		}&lt;br /&gt;
		try {&lt;br /&gt;
			periodReader = new FileReader(&amp;quot;/sys/class/pwm/pwm0/period&amp;quot;);&lt;br /&gt;
		} catch (Exception e) {&lt;br /&gt;
			e.printStackTrace();&lt;br /&gt;
		}&lt;br /&gt;
		try {&lt;br /&gt;
			periodWriter = new FileWriter(&amp;quot;/sys/class/pwm/pwm0/period&amp;quot;);&lt;br /&gt;
		} catch (Exception e) {&lt;br /&gt;
			e.printStackTrace();&lt;br /&gt;
		}&lt;br /&gt;
		try {&lt;br /&gt;
			dutyReader = new FileReader(&amp;quot;/sys/class/pwm/pwm0/duty&amp;quot;);&lt;br /&gt;
		} catch (Exception e) {&lt;br /&gt;
			e.printStackTrace();&lt;br /&gt;
		}&lt;br /&gt;
		try {&lt;br /&gt;
			dutyWriter = new FileWriter(&amp;quot;/sys/class/pwm/pwm0/duty&amp;quot;);&lt;br /&gt;
		} catch (Exception e) {&lt;br /&gt;
			e.printStackTrace();&lt;br /&gt;
		}&lt;br /&gt;
		this.setActive(active);&lt;br /&gt;
		this.setDuty(duty);&lt;br /&gt;
		this.setFrequency(frequency);&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	public static void main(String[] args) throws Exception {&lt;br /&gt;
		Imxpwm maPWM = new Imxpwm(50, 75, true);&lt;br /&gt;
		double d = 0.0;&lt;br /&gt;
		for (int j = 0; j &amp;lt; 100; j++) {&lt;br /&gt;
			for (int i = 5; i &amp;lt;= 999; i++) {&lt;br /&gt;
				d = i * 1.0 / 10.0;&lt;br /&gt;
				maPWM.setDuty(d);&lt;br /&gt;
			}&lt;br /&gt;
		}&lt;br /&gt;
		maPWM.setFrequency(500);&lt;br /&gt;
		maPWM.setPeriod(50000);&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Audio Mode ===&lt;br /&gt;
Audio playback mode is working since v0.5 of PWM driver (thanks to [[User:SebastienR|SebastienR]]).&lt;br /&gt;
You can play 8, 16 &amp;amp; 32 KHz 8bit linear RAW sound. It&#039;s recommended to play 8kHz one, as they use less CPU ressources.&lt;br /&gt;
To convert a sound to the right format we recommend to use SoX (on Linux).&lt;br /&gt;
For exemple:&lt;br /&gt;
 [host]$ sox /usr/share/sounds/KDE_Chimes_1.ogg -r 8192 -b -u -c 1 Chimes.raw&lt;br /&gt;
 -r -&amp;gt; sampling rate&lt;br /&gt;
 -b -&amp;gt; byte/8bit signal&lt;br /&gt;
 -u -&amp;gt; linear /not compressed&lt;br /&gt;
 -c 1 -&amp;gt; Mono / 1 channel&lt;br /&gt;
&lt;br /&gt;
Then you can test it using &#039;&#039;target/linux/modules/pwm/test/testplaymode&#039;&#039;, which can be compiled that way:&lt;br /&gt;
&amp;lt;pre class=&amp;quot;host&amp;quot;&amp;gt;&lt;br /&gt;
 $ make shell_env&lt;br /&gt;
 $ . armadeus_env.sh&lt;br /&gt;
 $ export PATH=$PATH:$ARMADEUS_TOOLCHAIN_PATH&lt;br /&gt;
 $ make -C target/linux/modules/pwm/test/&lt;br /&gt;
 $ cp target/linux/modules/pwm/test/testplaymode /tftpboot/&lt;br /&gt;
 $ cp target/linux/modules/pwm/test/KDE_Startup_2.raw /tftpboot/&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
on target do:&lt;br /&gt;
&amp;lt;pre class=&amp;quot;apf&amp;quot;&amp;gt;&lt;br /&gt;
 # testplaymode&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
or&lt;br /&gt;
&amp;lt;pre class=&amp;quot;apf&amp;quot;&amp;gt;&lt;br /&gt;
 # testplaymode KDE_Startup_2.raw&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Going further==&lt;br /&gt;
If you need more than one PWM at a time, you can use the APF&#039;s FPGA with [[MotionSystem|the following project]].&lt;br /&gt;
&lt;br /&gt;
== Links ==&lt;br /&gt;
* [http://sox.sourceforge.net/Docs/FAQ SoX, sound format converter]&lt;br /&gt;
* http://en.wikipedia.org/wiki/Pulse-width_modulation&lt;br /&gt;
&lt;br /&gt;
[[Category:Linux_drivers]]&lt;br /&gt;
[[Category:ExternalDeviceControl]]&lt;/div&gt;</summary>
		<author><name>OlivierR</name></author>
	</entry>
	<entry>
		<id>http://wikilegacy.armadeus.com/index.php?title=PWM&amp;diff=7407</id>
		<title>PWM</title>
		<link rel="alternate" type="text/html" href="http://wikilegacy.armadeus.com/index.php?title=PWM&amp;diff=7407"/>
		<updated>2009-09-27T18:43:25Z</updated>

		<summary type="html">&lt;p&gt;OlivierR: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;On this page, you will find usefull informations to configure and use the Pulse Width Modulation (PWM) capabilities of your [[APF9328]]/[[APF27]] boards.&lt;br /&gt;
&lt;br /&gt;
The i.MX processor is capable of driving 2 PWM signals:&lt;br /&gt;
* one is linked to the LCD controller and allow to control the [[BackLight | LCD backlight]]&lt;br /&gt;
* the other can be used to generate a PWM signal in several mode:&lt;br /&gt;
** audio playback&lt;br /&gt;
** real PWM&lt;br /&gt;
&lt;br /&gt;
==Hardware==&lt;br /&gt;
i.MX PWM module is using &#039;&#039;PWMO&#039;&#039; (pin 2 of PortA on [[APF9328]] and pin 5 of PortE on the [[APF27]]) as ouput.&lt;br /&gt;
* On [[APF9328DevLight]] this pin is accessible from &#039;&#039;TIMER&#039;&#039; zone under the board (See [http://www.armadeus.com/_downloads/apf9328DevLight/documentation/dataSheet_APF9328_DevLight_V2.pdf datasheets for more infos)]&lt;br /&gt;
* On [[APF9328DevFull|APF9328DevFull development boards]] this pin is connected to pin 4 (TIM2) of &#039;&#039;&amp;quot;Timers&amp;quot;&#039;&#039; connector (X21)&lt;br /&gt;
* On [[APF27Dev|APF27Dev development boards]] this pin is connected to pin 4 of J22&lt;br /&gt;
&lt;br /&gt;
== Linux driver installation ==&lt;br /&gt;
i.MX PWM driver is installed by default in standard Armadeus rootfs.&lt;br /&gt;
&lt;br /&gt;
== Usage ==&lt;br /&gt;
* Load the module:&lt;br /&gt;
&amp;lt;pre class=&amp;quot;apf&amp;quot;&amp;gt;&lt;br /&gt;
 # modprobe imx-pwm&lt;br /&gt;
 Initializing PWM class.&lt;br /&gt;
  Initializing PWM#0...PWM major number = 251&lt;br /&gt;
 PWM driver v0.7&lt;br /&gt;
 done.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* If you plan to use sound, create &#039;&#039;/dev/pwm&#039;&#039; device file if not already existing (Major is dynamically allocated)&lt;br /&gt;
&amp;lt;pre class=&amp;quot;apf&amp;quot;&amp;gt;&lt;br /&gt;
 # DEV=`cat /proc/devices | grep imx-pwm | cut -d &amp;quot; &amp;quot; -f 1`; mknod /dev/pwm c $DEV 0&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== PWM Mode ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;strong&amp;gt;Remark:&amp;lt;/strong&amp;gt;&lt;br /&gt;
* The pwm has a resolution of 1uS&lt;br /&gt;
&lt;br /&gt;
After driver loading, you have access to &#039;&#039;/sys/class/pwm/...&#039;&#039; functionnalities:&lt;br /&gt;
* to change frequency (for example 500 Hz):&lt;br /&gt;
&amp;lt;pre class=&amp;quot;apf&amp;quot;&amp;gt;&lt;br /&gt;
 # echo 500 &amp;gt; /sys/class/pwm/pwm0/frequency&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* to change period (for example 100us):&lt;br /&gt;
&amp;lt;pre class=&amp;quot;apf&amp;quot;&amp;gt;&lt;br /&gt;
 # echo 100 &amp;gt; /sys/class/pwm/pwm0/period&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* to change duty cycle (for example 50.0%)&lt;br /&gt;
&amp;lt;pre class=&amp;quot;apf&amp;quot;&amp;gt;&lt;br /&gt;
 # echo 500 &amp;gt; /sys/class/pwm/pwm0/duty&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* to activate PWM:&lt;br /&gt;
&amp;lt;pre class=&amp;quot;apf&amp;quot;&amp;gt;&lt;br /&gt;
 # echo 1 &amp;gt; /sys/class/pwm/pwm0/active&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* to de-activate PWM:&lt;br /&gt;
&amp;lt;pre class=&amp;quot;apf&amp;quot;&amp;gt;&lt;br /&gt;
 # echo 0 &amp;gt; /sys/class/pwm/pwm0/active&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Bash test script ====&lt;br /&gt;
* A Bash test script is available given here :&lt;br /&gt;
&amp;lt;source lang=&amp;quot;Bash&amp;quot;&amp;gt;&lt;br /&gt;
#!/bin/sh&lt;br /&gt;
#&lt;br /&gt;
# script to command imx pwm &lt;br /&gt;
# usage : pwm_imx frequency duty &lt;br /&gt;
#&lt;br /&gt;
&lt;br /&gt;
if [ $# -lt 2 ] &lt;br /&gt;
then&lt;br /&gt;
echo &amp;quot;Provide two arguments to this script !&amp;quot;&lt;br /&gt;
echo &amp;quot;pwm_imx frequency dutycycle&amp;quot;&lt;br /&gt;
exit 1&lt;br /&gt;
fi&lt;br /&gt;
&lt;br /&gt;
SYS_DIR=&amp;quot;/sys/class/pwm/pwm0/&amp;quot;&lt;br /&gt;
FREQUENCY=$1&lt;br /&gt;
DUTY=$2&lt;br /&gt;
&lt;br /&gt;
DUTY=`(echo $DUTY | awk &#039;{ print $1*10}&#039;)`&lt;br /&gt;
&lt;br /&gt;
if [ ! -d &amp;quot;$SYS_DIR&amp;quot; ]; then&lt;br /&gt;
echo &amp;quot;Can&#039;t find /sys/ interface for PWM&amp;quot;&lt;br /&gt;
exit 1&lt;br /&gt;
fi&lt;br /&gt;
&lt;br /&gt;
echo &amp;quot;Starting PWM&amp;quot;&lt;br /&gt;
echo 1 &amp;gt; $SYS_DIR/active&lt;br /&gt;
&lt;br /&gt;
#SET FREQUENCY&lt;br /&gt;
echo $FREQUENCY &amp;gt; $SYS_DIR/frequency&lt;br /&gt;
echo &amp;quot;Setting PWM to $FREQUENCY Hz&amp;quot;&lt;br /&gt;
&lt;br /&gt;
#SET DUTY CYCLE&lt;br /&gt;
echo $DUTY &amp;gt; $SYS_DIR/duty&lt;br /&gt;
echo &amp;quot;Setting DUTY to $2 %&amp;quot;&lt;br /&gt;
&lt;br /&gt;
exit 0&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== PWM with Java ====&lt;br /&gt;
&lt;br /&gt;
The code bellow shows how to directly use PWM from Java. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;Java&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
import java.io.*;&lt;br /&gt;
&lt;br /&gt;
public class Imxpwm {&lt;br /&gt;
&lt;br /&gt;
	private FileReader activeReader;&lt;br /&gt;
&lt;br /&gt;
	private FileWriter activeWriter;&lt;br /&gt;
&lt;br /&gt;
	private FileReader frequencyReader;&lt;br /&gt;
&lt;br /&gt;
	private FileWriter frequencyWriter;&lt;br /&gt;
&lt;br /&gt;
	private FileReader periodReader;&lt;br /&gt;
&lt;br /&gt;
	private FileWriter periodWriter;&lt;br /&gt;
&lt;br /&gt;
	private FileReader dutyReader;&lt;br /&gt;
&lt;br /&gt;
	private FileWriter dutyWriter;&lt;br /&gt;
&lt;br /&gt;
	public boolean isActive() {&lt;br /&gt;
		try {&lt;br /&gt;
			int result = this.activeReader.read();&lt;br /&gt;
			if (result == 0) {&lt;br /&gt;
				return true;&lt;br /&gt;
			} else {&lt;br /&gt;
				return false;&lt;br /&gt;
			}&lt;br /&gt;
		} catch (Exception e) {&lt;br /&gt;
			e.printStackTrace();&lt;br /&gt;
			return false;&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	public void setActive(boolean active) {&lt;br /&gt;
		try {&lt;br /&gt;
			if (active) {&lt;br /&gt;
				this.activeWriter.write(&amp;quot;1&amp;quot;);&lt;br /&gt;
				this.activeWriter.flush();&lt;br /&gt;
			} else {&lt;br /&gt;
				this.activeWriter.write(&amp;quot;0&amp;quot;);&lt;br /&gt;
				this.activeWriter.flush();&lt;br /&gt;
			}&lt;br /&gt;
		} catch (Exception e) {&lt;br /&gt;
			e.printStackTrace();&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	public double getDuty() {&lt;br /&gt;
		try {&lt;br /&gt;
			return this.dutyReader.read()/10.0;&lt;br /&gt;
		} catch (Exception e) {&lt;br /&gt;
			e.printStackTrace();&lt;br /&gt;
			return -1.0;&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	public void setDuty(double duty) {&lt;br /&gt;
		try {&lt;br /&gt;
			this.dutyWriter.write(Double.toString(duty * 10));&lt;br /&gt;
			this.dutyWriter.flush();&lt;br /&gt;
		} catch (Exception e) {&lt;br /&gt;
			e.printStackTrace();&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	public int getFrequency() {&lt;br /&gt;
		try {&lt;br /&gt;
			return this.frequencyReader.read();&lt;br /&gt;
		} catch (Exception e) {&lt;br /&gt;
			e.printStackTrace();&lt;br /&gt;
			return -1;&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	public void setFrequency(int frequency) {&lt;br /&gt;
		try {&lt;br /&gt;
			this.frequencyWriter.write(Integer.toString(frequency));&lt;br /&gt;
			this.frequencyWriter.flush();&lt;br /&gt;
		} catch (Exception e) {&lt;br /&gt;
			e.printStackTrace();&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	public int getPeriod() {&lt;br /&gt;
		try {&lt;br /&gt;
			return this.periodReader.read();&lt;br /&gt;
		} catch (Exception e) {&lt;br /&gt;
			e.printStackTrace();&lt;br /&gt;
			return -1;&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	public void setPeriod(int period) {&lt;br /&gt;
		try {&lt;br /&gt;
			// en µs&lt;br /&gt;
			this.periodWriter.write(Integer.toString(period));&lt;br /&gt;
			this.periodWriter.flush();&lt;br /&gt;
		} catch (Exception e) {&lt;br /&gt;
			e.printStackTrace();&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	/**&lt;br /&gt;
	 * @param frequency&lt;br /&gt;
	 * @param duty&lt;br /&gt;
	 * @param period&lt;br /&gt;
	 * @param active&lt;br /&gt;
	 */&lt;br /&gt;
	public Imxpwm(int frequency, int duty, boolean active) {&lt;br /&gt;
&lt;br /&gt;
		try {&lt;br /&gt;
			activeReader = new FileReader(&amp;quot;/sys/class/pwm/pwm0/active&amp;quot;);&lt;br /&gt;
		} catch (Exception e) {&lt;br /&gt;
			e.printStackTrace();&lt;br /&gt;
		}&lt;br /&gt;
		try {&lt;br /&gt;
			activeWriter = new FileWriter(&amp;quot;/sys/class/pwm/pwm0/active&amp;quot;);&lt;br /&gt;
		} catch (Exception e) {&lt;br /&gt;
			e.printStackTrace();&lt;br /&gt;
		}&lt;br /&gt;
		try {&lt;br /&gt;
			frequencyReader = new FileReader(&amp;quot;/sys/class/pwm/pwm0/frequency&amp;quot;);&lt;br /&gt;
		} catch (Exception e) {&lt;br /&gt;
			e.printStackTrace();&lt;br /&gt;
		}&lt;br /&gt;
		try {&lt;br /&gt;
			frequencyWriter = new FileWriter(&amp;quot;/sys/class/pwm/pwm0/frequency&amp;quot;);&lt;br /&gt;
		} catch (Exception e) {&lt;br /&gt;
			e.printStackTrace();&lt;br /&gt;
		}&lt;br /&gt;
		try {&lt;br /&gt;
			periodReader = new FileReader(&amp;quot;/sys/class/pwm/pwm0/period&amp;quot;);&lt;br /&gt;
		} catch (Exception e) {&lt;br /&gt;
			e.printStackTrace();&lt;br /&gt;
		}&lt;br /&gt;
		try {&lt;br /&gt;
			periodWriter = new FileWriter(&amp;quot;/sys/class/pwm/pwm0/period&amp;quot;);&lt;br /&gt;
		} catch (Exception e) {&lt;br /&gt;
			e.printStackTrace();&lt;br /&gt;
		}&lt;br /&gt;
		try {&lt;br /&gt;
			dutyReader = new FileReader(&amp;quot;/sys/class/pwm/pwm0/duty&amp;quot;);&lt;br /&gt;
		} catch (Exception e) {&lt;br /&gt;
			e.printStackTrace();&lt;br /&gt;
		}&lt;br /&gt;
		try {&lt;br /&gt;
			dutyWriter = new FileWriter(&amp;quot;/sys/class/pwm/pwm0/duty&amp;quot;);&lt;br /&gt;
		} catch (Exception e) {&lt;br /&gt;
			e.printStackTrace();&lt;br /&gt;
		}&lt;br /&gt;
		this.setActive(active);&lt;br /&gt;
		this.setDuty(duty);&lt;br /&gt;
		this.setFrequency(frequency);&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	public static void main(String[] args) throws Exception {&lt;br /&gt;
		Imxpwm maPWM = new Imxpwm(50, 75, true);&lt;br /&gt;
		double d = 0.0;&lt;br /&gt;
		for (int j = 0; j &amp;lt; 100; j++) {&lt;br /&gt;
			for (int i = 5; i &amp;lt;= 999; i++) {&lt;br /&gt;
				d = i * 1.0 / 10.0;&lt;br /&gt;
				maPWM.setDuty(d);&lt;br /&gt;
			}&lt;br /&gt;
		}&lt;br /&gt;
		maPWM.setFrequency(500);&lt;br /&gt;
		maPWM.setPeriod(50000);&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Audio Mode ===&lt;br /&gt;
Audio playback mode is working since v0.5 of PWM driver (thanks to [[User:SebastienR|SebastienR]]).&lt;br /&gt;
You can play 8, 16 &amp;amp; 32 KHz 8bit linear RAW sound. It&#039;s recommended to play 8kHz one, as they use less CPU ressources.&lt;br /&gt;
To convert a sound to the right format we recommend to use SoX (on Linux).&lt;br /&gt;
For exemple:&lt;br /&gt;
 [host]$ sox /usr/share/sounds/KDE_Chimes_1.ogg -r 8192 -b -u -c 1 Chimes.raw&lt;br /&gt;
 -r -&amp;gt; sampling rate&lt;br /&gt;
 -b -&amp;gt; byte/8bit signal&lt;br /&gt;
 -u -&amp;gt; linear /not compressed&lt;br /&gt;
 -c 1 -&amp;gt; Mono / 1 channel&lt;br /&gt;
&lt;br /&gt;
Then you can test it using &#039;&#039;target/linux/modules/pwm/test/testplaymode&#039;&#039;, which can be compiled that way:&lt;br /&gt;
&amp;lt;pre class=&amp;quot;host&amp;quot;&amp;gt;&lt;br /&gt;
 $ make shell_env&lt;br /&gt;
 $ . armadeus_env.sh&lt;br /&gt;
 $ export PATH=$PATH:$ARMADEUS_TOOLCHAIN_PATH&lt;br /&gt;
 $ make -C target/linux/modules/pwm/test/&lt;br /&gt;
 $ cp target/linux/modules/pwm/test/testplaymode /tftpboot/&lt;br /&gt;
 $ cp target/linux/modules/pwm/test/KDE_Startup_2.raw /tftpboot/&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
on target do:&lt;br /&gt;
&amp;lt;pre class=&amp;quot;apf&amp;quot;&amp;gt;&lt;br /&gt;
 # testplaymode&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
or&lt;br /&gt;
&amp;lt;pre class=&amp;quot;apf&amp;quot;&amp;gt;&lt;br /&gt;
 # testplaymode KDE_Startup_2.raw&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Going further==&lt;br /&gt;
If you need more than one PWM at a time, you can use the APF&#039;s FPGA with [[MotionSystem|the following project]].&lt;br /&gt;
&lt;br /&gt;
== Links ==&lt;br /&gt;
* [http://sox.sourceforge.net/Docs/FAQ SoX, sound format converter]&lt;br /&gt;
* http://en.wikipedia.org/wiki/Pulse-width_modulation&lt;br /&gt;
&lt;br /&gt;
[[Category:Linux_drivers]]&lt;br /&gt;
[[Category:ExternalDeviceControl]]&lt;/div&gt;</summary>
		<author><name>OlivierR</name></author>
	</entry>
	<entry>
		<id>http://wikilegacy.armadeus.com/index.php?title=PWM&amp;diff=7406</id>
		<title>PWM</title>
		<link rel="alternate" type="text/html" href="http://wikilegacy.armadeus.com/index.php?title=PWM&amp;diff=7406"/>
		<updated>2009-09-27T18:39:54Z</updated>

		<summary type="html">&lt;p&gt;OlivierR: /* PWM Mode */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;On this page, you will find usefull informations to configure and use the Pulse Width Modulation (PWM) capabilities of your [[APF9328]]/[[APF27]] boards.&lt;br /&gt;
&lt;br /&gt;
The i.MX processor is capable of driving 2 PWM signals:&lt;br /&gt;
* one is linked to the LCD controller and allow to control the [[BackLight | LCD backlight]]&lt;br /&gt;
* the other can be used to generate a PWM signal in several mode:&lt;br /&gt;
** audio playback&lt;br /&gt;
** real PWM&lt;br /&gt;
&lt;br /&gt;
==Hardware==&lt;br /&gt;
i.MX PWM module is using &#039;&#039;PWMO&#039;&#039; (pin 2 of PortA on [[APF9328]] and pin 5 of PortE on the [[APF27]]) as ouput.&lt;br /&gt;
* On [[APF9328DevLight]] this pin is accessible from &#039;&#039;TIMER&#039;&#039; zone under the board (See [http://www.armadeus.com/_downloads/apf9328DevLight/documentation/dataSheet_APF9328_DevLight_V2.pdf datasheets for more infos)]&lt;br /&gt;
* On [[APF9328DevFull|APF9328DevFull development boards]] this pin is connected to pin 4 (TIM2) of &#039;&#039;&amp;quot;Timers&amp;quot;&#039;&#039; connector (X21)&lt;br /&gt;
* On [[APF27Dev|APF27Dev development boards]] this pin is connected to pin 4 of J22&lt;br /&gt;
&lt;br /&gt;
== Linux driver installation ==&lt;br /&gt;
i.MX PWM driver is installed by default in standard Armadeus rootfs.&lt;br /&gt;
&lt;br /&gt;
== Usage ==&lt;br /&gt;
* Load the module:&lt;br /&gt;
&amp;lt;pre class=&amp;quot;apf&amp;quot;&amp;gt;&lt;br /&gt;
 # modprobe imx-pwm&lt;br /&gt;
 Initializing PWM class.&lt;br /&gt;
  Initializing PWM#0...PWM major number = 251&lt;br /&gt;
 PWM driver v0.7&lt;br /&gt;
 done.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* If you plan to use sound, create &#039;&#039;/dev/pwm&#039;&#039; device file if not already existing (Major is dynamically allocated)&lt;br /&gt;
&amp;lt;pre class=&amp;quot;apf&amp;quot;&amp;gt;&lt;br /&gt;
 # DEV=`cat /proc/devices | grep imx-pwm | cut -d &amp;quot; &amp;quot; -f 1`; mknod /dev/pwm c $DEV 0&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== PWM Mode ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;strong&amp;gt;Remark:&amp;lt;/strong&amp;gt;&lt;br /&gt;
* The pwm has a resolution of 1uS&lt;br /&gt;
&lt;br /&gt;
After driver loading, you have access to &#039;&#039;/sys/class/pwm/...&#039;&#039; functionnalities:&lt;br /&gt;
* to change frequency (for example 500 Hz):&lt;br /&gt;
&amp;lt;pre class=&amp;quot;apf&amp;quot;&amp;gt;&lt;br /&gt;
 # echo 500 &amp;gt; /sys/class/pwm/pwm0/frequency&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* to change period (for example 100us):&lt;br /&gt;
&amp;lt;pre class=&amp;quot;apf&amp;quot;&amp;gt;&lt;br /&gt;
 # echo 100 &amp;gt; /sys/class/pwm/pwm0/period&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* to change duty cycle (for example 50.0%)&lt;br /&gt;
&amp;lt;pre class=&amp;quot;apf&amp;quot;&amp;gt;&lt;br /&gt;
 # echo 500 &amp;gt; /sys/class/pwm/pwm0/duty&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* to activate PWM:&lt;br /&gt;
&amp;lt;pre class=&amp;quot;apf&amp;quot;&amp;gt;&lt;br /&gt;
 # echo 1 &amp;gt; /sys/class/pwm/pwm0/active&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* to de-activate PWM:&lt;br /&gt;
&amp;lt;pre class=&amp;quot;apf&amp;quot;&amp;gt;&lt;br /&gt;
 # echo 0 &amp;gt; /sys/class/pwm/pwm0/active&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* A Bash test script is available given here :&lt;br /&gt;
&amp;lt;source lang=&amp;quot;Bash&amp;quot;&amp;gt;&lt;br /&gt;
#!/bin/sh&lt;br /&gt;
#&lt;br /&gt;
# script to command imx pwm &lt;br /&gt;
# usage : pwm_imx frequency duty &lt;br /&gt;
#&lt;br /&gt;
&lt;br /&gt;
if [ $# -lt 2 ] &lt;br /&gt;
then&lt;br /&gt;
echo &amp;quot;Provide two arguments to this script !&amp;quot;&lt;br /&gt;
echo &amp;quot;pwm_imx frequency dutycycle&amp;quot;&lt;br /&gt;
exit 1&lt;br /&gt;
fi&lt;br /&gt;
&lt;br /&gt;
SYS_DIR=&amp;quot;/sys/class/pwm/pwm0/&amp;quot;&lt;br /&gt;
FREQUENCY=$1&lt;br /&gt;
DUTY=$2&lt;br /&gt;
&lt;br /&gt;
DUTY=`(echo $DUTY | awk &#039;{ print $1*10}&#039;)`&lt;br /&gt;
&lt;br /&gt;
if [ ! -d &amp;quot;$SYS_DIR&amp;quot; ]; then&lt;br /&gt;
echo &amp;quot;Can&#039;t find /sys/ interface for PWM&amp;quot;&lt;br /&gt;
exit 1&lt;br /&gt;
fi&lt;br /&gt;
&lt;br /&gt;
echo &amp;quot;Starting PWM&amp;quot;&lt;br /&gt;
echo 1 &amp;gt; $SYS_DIR/active&lt;br /&gt;
&lt;br /&gt;
#SET FREQUENCY&lt;br /&gt;
echo $FREQUENCY &amp;gt; $SYS_DIR/frequency&lt;br /&gt;
echo &amp;quot;Setting PWM to $FREQUENCY Hz&amp;quot;&lt;br /&gt;
&lt;br /&gt;
#SET DUTY CYCLE&lt;br /&gt;
echo $DUTY &amp;gt; $SYS_DIR/duty&lt;br /&gt;
echo &amp;quot;Setting DUTY to $2 %&amp;quot;&lt;br /&gt;
&lt;br /&gt;
exit 0&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Audio Mode ===&lt;br /&gt;
Audio playback mode is working since v0.5 of PWM driver (thanks to [[User:SebastienR|SebastienR]]).&lt;br /&gt;
You can play 8, 16 &amp;amp; 32 KHz 8bit linear RAW sound. It&#039;s recommended to play 8kHz one, as they use less CPU ressources.&lt;br /&gt;
To convert a sound to the right format we recommend to use SoX (on Linux).&lt;br /&gt;
For exemple:&lt;br /&gt;
 [host]$ sox /usr/share/sounds/KDE_Chimes_1.ogg -r 8192 -b -u -c 1 Chimes.raw&lt;br /&gt;
 -r -&amp;gt; sampling rate&lt;br /&gt;
 -b -&amp;gt; byte/8bit signal&lt;br /&gt;
 -u -&amp;gt; linear /not compressed&lt;br /&gt;
 -c 1 -&amp;gt; Mono / 1 channel&lt;br /&gt;
&lt;br /&gt;
Then you can test it using &#039;&#039;target/linux/modules/pwm/test/testplaymode&#039;&#039;, which can be compiled that way:&lt;br /&gt;
&amp;lt;pre class=&amp;quot;host&amp;quot;&amp;gt;&lt;br /&gt;
 $ make shell_env&lt;br /&gt;
 $ . armadeus_env.sh&lt;br /&gt;
 $ export PATH=$PATH:$ARMADEUS_TOOLCHAIN_PATH&lt;br /&gt;
 $ make -C target/linux/modules/pwm/test/&lt;br /&gt;
 $ cp target/linux/modules/pwm/test/testplaymode /tftpboot/&lt;br /&gt;
 $ cp target/linux/modules/pwm/test/KDE_Startup_2.raw /tftpboot/&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
on target do:&lt;br /&gt;
&amp;lt;pre class=&amp;quot;apf&amp;quot;&amp;gt;&lt;br /&gt;
 # testplaymode&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
or&lt;br /&gt;
&amp;lt;pre class=&amp;quot;apf&amp;quot;&amp;gt;&lt;br /&gt;
 # testplaymode KDE_Startup_2.raw&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Going further==&lt;br /&gt;
If you need more than one PWM at a time, you can use the APF&#039;s FPGA with [[MotionSystem|the following project]].&lt;br /&gt;
&lt;br /&gt;
== Links ==&lt;br /&gt;
* [http://sox.sourceforge.net/Docs/FAQ SoX, sound format converter]&lt;br /&gt;
* http://en.wikipedia.org/wiki/Pulse-width_modulation&lt;br /&gt;
&lt;br /&gt;
[[Category:Linux_drivers]]&lt;br /&gt;
[[Category:ExternalDeviceControl]]&lt;/div&gt;</summary>
		<author><name>OlivierR</name></author>
	</entry>
	<entry>
		<id>http://wikilegacy.armadeus.com/index.php?title=PWM&amp;diff=7405</id>
		<title>PWM</title>
		<link rel="alternate" type="text/html" href="http://wikilegacy.armadeus.com/index.php?title=PWM&amp;diff=7405"/>
		<updated>2009-09-27T18:38:47Z</updated>

		<summary type="html">&lt;p&gt;OlivierR: /* PWM Mode */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;On this page, you will find usefull informations to configure and use the Pulse Width Modulation (PWM) capabilities of your [[APF9328]]/[[APF27]] boards.&lt;br /&gt;
&lt;br /&gt;
The i.MX processor is capable of driving 2 PWM signals:&lt;br /&gt;
* one is linked to the LCD controller and allow to control the [[BackLight | LCD backlight]]&lt;br /&gt;
* the other can be used to generate a PWM signal in several mode:&lt;br /&gt;
** audio playback&lt;br /&gt;
** real PWM&lt;br /&gt;
&lt;br /&gt;
==Hardware==&lt;br /&gt;
i.MX PWM module is using &#039;&#039;PWMO&#039;&#039; (pin 2 of PortA on [[APF9328]] and pin 5 of PortE on the [[APF27]]) as ouput.&lt;br /&gt;
* On [[APF9328DevLight]] this pin is accessible from &#039;&#039;TIMER&#039;&#039; zone under the board (See [http://www.armadeus.com/_downloads/apf9328DevLight/documentation/dataSheet_APF9328_DevLight_V2.pdf datasheets for more infos)]&lt;br /&gt;
* On [[APF9328DevFull|APF9328DevFull development boards]] this pin is connected to pin 4 (TIM2) of &#039;&#039;&amp;quot;Timers&amp;quot;&#039;&#039; connector (X21)&lt;br /&gt;
* On [[APF27Dev|APF27Dev development boards]] this pin is connected to pin 4 of J22&lt;br /&gt;
&lt;br /&gt;
== Linux driver installation ==&lt;br /&gt;
i.MX PWM driver is installed by default in standard Armadeus rootfs.&lt;br /&gt;
&lt;br /&gt;
== Usage ==&lt;br /&gt;
* Load the module:&lt;br /&gt;
&amp;lt;pre class=&amp;quot;apf&amp;quot;&amp;gt;&lt;br /&gt;
 # modprobe imx-pwm&lt;br /&gt;
 Initializing PWM class.&lt;br /&gt;
  Initializing PWM#0...PWM major number = 251&lt;br /&gt;
 PWM driver v0.7&lt;br /&gt;
 done.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* If you plan to use sound, create &#039;&#039;/dev/pwm&#039;&#039; device file if not already existing (Major is dynamically allocated)&lt;br /&gt;
&amp;lt;pre class=&amp;quot;apf&amp;quot;&amp;gt;&lt;br /&gt;
 # DEV=`cat /proc/devices | grep imx-pwm | cut -d &amp;quot; &amp;quot; -f 1`; mknod /dev/pwm c $DEV 0&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== PWM Mode ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;strong&amp;gt;Remark:&amp;lt;/strong&amp;gt;&lt;br /&gt;
* The pwm has a resolution of 1uS&lt;br /&gt;
&lt;br /&gt;
After driver loading, you have access to &#039;&#039;/sys/class/pwm/...&#039;&#039; functionnalities:&lt;br /&gt;
* to change frequency (for example 500 Hz):&lt;br /&gt;
&amp;lt;pre class=&amp;quot;apf&amp;quot;&amp;gt;&lt;br /&gt;
 # echo 500 &amp;gt; /sys/class/pwm/pwm0/frequency&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* to change period (for example 100us):&lt;br /&gt;
&amp;lt;pre class=&amp;quot;apf&amp;quot;&amp;gt;&lt;br /&gt;
 # echo 100 &amp;gt; /sys/class/pwm/pwm0/period&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* to change duty cycle (for example 50.0%)&lt;br /&gt;
&amp;lt;pre class=&amp;quot;apf&amp;quot;&amp;gt;&lt;br /&gt;
 # echo 500 &amp;gt; /sys/class/pwm/pwm0/duty&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* to activate PWM:&lt;br /&gt;
&amp;lt;pre class=&amp;quot;apf&amp;quot;&amp;gt;&lt;br /&gt;
 # echo 1 &amp;gt; /sys/class/pwm/pwm0/active&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* to de-activate PWM:&lt;br /&gt;
&amp;lt;pre class=&amp;quot;apf&amp;quot;&amp;gt;&lt;br /&gt;
 # echo 0 &amp;gt; /sys/class/pwm/pwm0/active&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* A test script is available given here :&lt;br /&gt;
&amp;lt;source lang=&amp;quot;Bash&amp;quot;&amp;gt;&lt;br /&gt;
#!/bin/sh&lt;br /&gt;
#&lt;br /&gt;
# script to command imx pwm &lt;br /&gt;
# usage : pwm_imx frequency duty &lt;br /&gt;
#&lt;br /&gt;
&lt;br /&gt;
if [ $# -lt 2 ] &lt;br /&gt;
then&lt;br /&gt;
echo &amp;quot;Provide two arguments to this script !&amp;quot;&lt;br /&gt;
echo &amp;quot;pwm_imx frequency dutycycle&amp;quot;&lt;br /&gt;
exit 1&lt;br /&gt;
fi&lt;br /&gt;
&lt;br /&gt;
SYS_DIR=&amp;quot;/sys/class/pwm/pwm0/&amp;quot;&lt;br /&gt;
FREQUENCY=$1&lt;br /&gt;
DUTY=$2&lt;br /&gt;
&lt;br /&gt;
DUTY=`(echo $DUTY | awk &#039;{ print $1*10}&#039;)`&lt;br /&gt;
&lt;br /&gt;
if [ ! -d &amp;quot;$SYS_DIR&amp;quot; ]; then&lt;br /&gt;
echo &amp;quot;Can&#039;t find /sys/ interface for PWM&amp;quot;&lt;br /&gt;
exit 1&lt;br /&gt;
fi&lt;br /&gt;
&lt;br /&gt;
echo &amp;quot;Starting PWM&amp;quot;&lt;br /&gt;
echo 1 &amp;gt; $SYS_DIR/active&lt;br /&gt;
&lt;br /&gt;
#SET FREQUENCY&lt;br /&gt;
echo $FREQUENCY &amp;gt; $SYS_DIR/frequency&lt;br /&gt;
echo &amp;quot;Setting PWM to $FREQUENCY Hz&amp;quot;&lt;br /&gt;
&lt;br /&gt;
#SET DUTY CYCLE&lt;br /&gt;
echo $DUTY &amp;gt; $SYS_DIR/duty&lt;br /&gt;
echo &amp;quot;Setting DUTY to $2 %&amp;quot;&lt;br /&gt;
&lt;br /&gt;
exit 0&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Audio Mode ===&lt;br /&gt;
Audio playback mode is working since v0.5 of PWM driver (thanks to [[User:SebastienR|SebastienR]]).&lt;br /&gt;
You can play 8, 16 &amp;amp; 32 KHz 8bit linear RAW sound. It&#039;s recommended to play 8kHz one, as they use less CPU ressources.&lt;br /&gt;
To convert a sound to the right format we recommend to use SoX (on Linux).&lt;br /&gt;
For exemple:&lt;br /&gt;
 [host]$ sox /usr/share/sounds/KDE_Chimes_1.ogg -r 8192 -b -u -c 1 Chimes.raw&lt;br /&gt;
 -r -&amp;gt; sampling rate&lt;br /&gt;
 -b -&amp;gt; byte/8bit signal&lt;br /&gt;
 -u -&amp;gt; linear /not compressed&lt;br /&gt;
 -c 1 -&amp;gt; Mono / 1 channel&lt;br /&gt;
&lt;br /&gt;
Then you can test it using &#039;&#039;target/linux/modules/pwm/test/testplaymode&#039;&#039;, which can be compiled that way:&lt;br /&gt;
&amp;lt;pre class=&amp;quot;host&amp;quot;&amp;gt;&lt;br /&gt;
 $ make shell_env&lt;br /&gt;
 $ . armadeus_env.sh&lt;br /&gt;
 $ export PATH=$PATH:$ARMADEUS_TOOLCHAIN_PATH&lt;br /&gt;
 $ make -C target/linux/modules/pwm/test/&lt;br /&gt;
 $ cp target/linux/modules/pwm/test/testplaymode /tftpboot/&lt;br /&gt;
 $ cp target/linux/modules/pwm/test/KDE_Startup_2.raw /tftpboot/&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
on target do:&lt;br /&gt;
&amp;lt;pre class=&amp;quot;apf&amp;quot;&amp;gt;&lt;br /&gt;
 # testplaymode&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
or&lt;br /&gt;
&amp;lt;pre class=&amp;quot;apf&amp;quot;&amp;gt;&lt;br /&gt;
 # testplaymode KDE_Startup_2.raw&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Going further==&lt;br /&gt;
If you need more than one PWM at a time, you can use the APF&#039;s FPGA with [[MotionSystem|the following project]].&lt;br /&gt;
&lt;br /&gt;
== Links ==&lt;br /&gt;
* [http://sox.sourceforge.net/Docs/FAQ SoX, sound format converter]&lt;br /&gt;
* http://en.wikipedia.org/wiki/Pulse-width_modulation&lt;br /&gt;
&lt;br /&gt;
[[Category:Linux_drivers]]&lt;br /&gt;
[[Category:ExternalDeviceControl]]&lt;/div&gt;</summary>
		<author><name>OlivierR</name></author>
	</entry>
	<entry>
		<id>http://wikilegacy.armadeus.com/index.php?title=Members&amp;diff=7403</id>
		<title>Members</title>
		<link rel="alternate" type="text/html" href="http://wikilegacy.armadeus.com/index.php?title=Members&amp;diff=7403"/>
		<updated>2009-09-25T07:19:21Z</updated>

		<summary type="html">&lt;p&gt;OlivierR: /* Google Map */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Google Map==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;googlemap lat=&amp;quot;47&amp;quot; lon=&amp;quot;6&amp;quot; width=640 height=480 zoom=4&amp;gt;&lt;br /&gt;
47.270377, 6.025314, [[User:JulienB]] Besancon&lt;br /&gt;
47.752598,7.301788, ARMadeus Systems&lt;br /&gt;
47.760791, 7.339897, [[User:Salocin68]] Mulhouse&lt;br /&gt;
47.734392,7.316975, [[User:FabienM]] Mulhouse&lt;br /&gt;
46.946161,7.517052, [[User:Jorasse]] Gümligen&lt;br /&gt;
47.681108, 7.390366, [[User:Carbure]] Helfranzkirch&lt;br /&gt;
47.436448, 8.429947, [[User:SonZerro]] Baden&lt;br /&gt;
44.653992, 6.176672, [[User:JulienN]] Chabottes&lt;br /&gt;
48.573342, 7.911476,  [[User:KroMignon]] Legelshurst&lt;br /&gt;
42.734405, 2.894211, ELIAUS Perpignan&lt;br /&gt;
47.653363, 6.862335, UTBM Belfort&lt;br /&gt;
45.689589, 5.026395, [[User:OlivierT]] St Bonnet de Mure&lt;br /&gt;
48.879619, 2.351074, Paris - 20 members&lt;br /&gt;
43.622159, 1.442642, Toulouse - 2 members&lt;br /&gt;
-21.115141, 55.536384, La Réunion - 1 member&lt;br /&gt;
14.551684, -60.912323, La Martinique - 1 member&lt;br /&gt;
48.682805, 2.169186, [[User:BrunoL]] Les Ulis&lt;br /&gt;
47.399744, 8.53775, Zurich - 1 member&lt;br /&gt;
46.810282, 7.151241, Fribourg&lt;br /&gt;
47.574904, 7.580566, Basel&lt;br /&gt;
&lt;br /&gt;
53.371859, -6.2677, Dublin - 1 member&lt;br /&gt;
50.637704, 5.608521, Liège - 1 member&lt;br /&gt;
50.67, 3.48, Velaines - 1 member&lt;br /&gt;
48.199964, 11.57959, Munich - 1 member&lt;br /&gt;
48.109588,-1.678752, Rennes - 1 member&lt;br /&gt;
47.750109,-3.366339, [[User:MatthieuT]] Lorient&lt;br /&gt;
48.70,2.03, [[User:JulienPeeters]] Chevreuse&lt;br /&gt;
45.190325, 5.700316, [[User:NicolasL]] Fontaine&lt;br /&gt;
49.279296, 2.472973 [[User:DavidC]] Nogent sur Oise&lt;br /&gt;
46.208644, 6.130027, [[User:EugeneR]] Genève&lt;br /&gt;
48.667158, 2.706585, [[User:BernardR]] Soignolles en Brie, France&lt;br /&gt;
45.188963, 5.709822, [[User:OlivierS]] Grenoble, France&lt;br /&gt;
47.214613,-0.737329, [[User:BrunoS]] Chemillé, France&lt;br /&gt;
47.225164,-1.556625, [[User:KevinP]] Nantes, France&lt;br /&gt;
43.609234, 1.442642, [[User:PierreBa]] Toulouse, France&lt;br /&gt;
41.668809,-0.87616, [[User:AntonioMB]] Zaragoza, España&lt;br /&gt;
49.200145, 0.407136, [[User:JeanFrancoisR]] - Asnières&lt;br /&gt;
48.109588,-1.678752, [[User:MichelTe]] - Rennes&lt;br /&gt;
49.163073, 2.550201, [[User:JulienBa]] - Pontarmé&lt;br /&gt;
43.488299, 5.494709, [[User:FrankA]] - Meyreuil&lt;br /&gt;
43.622159, 1.442642, [[User:PierreAlexandreS]] - Toulouse, France&lt;br /&gt;
51.46513, -0.9692, [[User:AlexG]] - Reading, UK&lt;br /&gt;
43.312439, 10.517693, [[User:PaoloB]] - Cecina, Italy&lt;br /&gt;
52.63, 4.75, Alkmaar - 1 member&lt;br /&gt;
47.201843, -0.991516, [[User:SamuelM]] - Beaupreau, France&lt;br /&gt;
50.776093, 14.632759, [[User:PetrD]] - Cvikov, ČR&lt;br /&gt;
48.42097, -4.471693, [[User:OlivierR]] - Brest, France&lt;br /&gt;
48.575244,-4.563446, [[User:JeanChristopheL]] - Brest, France&lt;br /&gt;
&amp;lt;/googlemap&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
===How to add your position===&lt;br /&gt;
* go to http://maps.google.com/&lt;br /&gt;
* type in the name of your town and launch &amp;quot;Search Google Maps&amp;quot;, for example:&lt;br /&gt;
[[Image:Google_maps_search.png]]&lt;br /&gt;
* right click on &amp;quot;Get URL of this page&amp;quot; and copy the URL&lt;br /&gt;
[[Image:Google_maps_url.png]]&lt;br /&gt;
* you should get something like that:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
http://maps.google.com/maps?f=q&amp;amp;hl=fr&amp;amp;geocode=&amp;amp;q=besan%C3%A7on&amp;amp;ie=UTF8&amp;amp;ll=47.257796,6.025314&amp;amp;spn=0.216236,0.601501&amp;amp;z=11&amp;amp;iwloc=addr&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* the data between &#039;&#039;&amp;amp;ll=&#039;&#039; and &#039;&#039;&amp;amp;spn&#039;&#039; are the needed one (latitude/longitude)&lt;br /&gt;
* extract them and copy them in the &amp;quot;Edit&amp;quot; of this wiki page. Add it you wiki name and your town. For example:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;googlemap lat=&amp;quot;47&amp;quot; lon=&amp;quot;6&amp;quot; width=640 height=480 zoom=4&amp;gt;&lt;br /&gt;
...&lt;br /&gt;
Others coordinates&lt;br /&gt;
...&lt;br /&gt;
47.257796, 6.025314, [[User:YourID]] - Your Town&lt;br /&gt;
&amp;lt;/googlemap&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Category:Association]]&lt;/div&gt;</summary>
		<author><name>OlivierR</name></author>
	</entry>
	<entry>
		<id>http://wikilegacy.armadeus.com/index.php?title=Members&amp;diff=7402</id>
		<title>Members</title>
		<link rel="alternate" type="text/html" href="http://wikilegacy.armadeus.com/index.php?title=Members&amp;diff=7402"/>
		<updated>2009-09-25T07:18:16Z</updated>

		<summary type="html">&lt;p&gt;OlivierR: /* Google Map */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Google Map==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;googlemap lat=&amp;quot;47&amp;quot; lon=&amp;quot;6&amp;quot; width=640 height=480 zoom=4&amp;gt;&lt;br /&gt;
47.270377, 6.025314, [[User:JulienB]] Besancon&lt;br /&gt;
47.752598,7.301788, ARMadeus Systems&lt;br /&gt;
47.760791, 7.339897, [[User:Salocin68]] Mulhouse&lt;br /&gt;
47.734392,7.316975, [[User:FabienM]] Mulhouse&lt;br /&gt;
46.946161,7.517052, [[User:Jorasse]] Gümligen&lt;br /&gt;
47.681108, 7.390366, [[User:Carbure]] Helfranzkirch&lt;br /&gt;
47.436448, 8.429947, [[User:SonZerro]] Baden&lt;br /&gt;
44.653992, 6.176672, [[User:JulienN]] Chabottes&lt;br /&gt;
48.573342, 7.911476,  [[User:KroMignon]] Legelshurst&lt;br /&gt;
42.734405, 2.894211, ELIAUS Perpignan&lt;br /&gt;
47.653363, 6.862335, UTBM Belfort&lt;br /&gt;
45.689589, 5.026395, [[User:OlivierT]] St Bonnet de Mure&lt;br /&gt;
48.879619, 2.351074, Paris - 20 members&lt;br /&gt;
43.622159, 1.442642, Toulouse - 2 members&lt;br /&gt;
-21.115141, 55.536384, La Réunion - 1 member&lt;br /&gt;
14.551684, -60.912323, La Martinique - 1 member&lt;br /&gt;
48.682805, 2.169186, [[User:BrunoL]] Les Ulis&lt;br /&gt;
47.399744, 8.53775, Zurich - 1 member&lt;br /&gt;
46.810282, 7.151241, Fribourg&lt;br /&gt;
47.574904, 7.580566, Basel&lt;br /&gt;
&lt;br /&gt;
53.371859, -6.2677, Dublin - 1 member&lt;br /&gt;
50.637704, 5.608521, Liège - 1 member&lt;br /&gt;
50.67, 3.48, Velaines - 1 member&lt;br /&gt;
48.199964, 11.57959, Munich - 1 member&lt;br /&gt;
48.109588,-1.678752, Rennes - 1 member&lt;br /&gt;
47.750109,-3.366339, [[User:MatthieuT]] Lorient&lt;br /&gt;
48.70,2.03, [[User:JulienPeeters]] Chevreuse&lt;br /&gt;
45.190325, 5.700316, [[User:NicolasL]] Fontaine&lt;br /&gt;
49.279296, 2.472973 [[User:DavidC]] Nogent sur Oise&lt;br /&gt;
46.208644, 6.130027, [[User:EugeneR]] Genève&lt;br /&gt;
48.667158, 2.706585, [[User:BernardR]] Soignolles en Brie, France&lt;br /&gt;
45.188963, 5.709822, [[User:OlivierS]] Grenoble, France&lt;br /&gt;
47.214613,-0.737329, [[User:BrunoS]] Chemillé, France&lt;br /&gt;
47.225164,-1.556625, [[User:KevinP]] Nantes, France&lt;br /&gt;
43.609234, 1.442642, [[User:PierreBa]] Toulouse, France&lt;br /&gt;
41.668809,-0.87616, [[User:AntonioMB]] Zaragoza, España&lt;br /&gt;
49.200145, 0.407136, [[User:JeanFrancoisR]] - Asnières&lt;br /&gt;
48.109588,-1.678752, [[User:MichelTe]] - Rennes&lt;br /&gt;
49.163073, 2.550201, [[User:JulienBa]] - Pontarmé&lt;br /&gt;
43.488299, 5.494709, [[User:FrankA]] - Meyreuil&lt;br /&gt;
43.622159, 1.442642, [[User:PierreAlexandreS]] - Toulouse, France&lt;br /&gt;
51.46513, -0.9692, [[User:AlexG]] - Reading, UK&lt;br /&gt;
43.312439, 10.517693, [[User:PaoloB]] - Cecina, Italy&lt;br /&gt;
52.63, 4.75, Alkmaar - 1 member&lt;br /&gt;
47.201843, -0.991516, [[User:SamuelM]] - Beaupreau, France&lt;br /&gt;
50.776093, 14.632759, [[User:PetrD]] - Cvikov, ČR&lt;br /&gt;
48.431479, -4.479504, [[User:OlivierR]] - Brest, France&lt;br /&gt;
48.575244,-4.563446, [[User:JeanChristopheL]] - Brest, France&lt;br /&gt;
&amp;lt;/googlemap&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
===How to add your position===&lt;br /&gt;
* go to http://maps.google.com/&lt;br /&gt;
* type in the name of your town and launch &amp;quot;Search Google Maps&amp;quot;, for example:&lt;br /&gt;
[[Image:Google_maps_search.png]]&lt;br /&gt;
* right click on &amp;quot;Get URL of this page&amp;quot; and copy the URL&lt;br /&gt;
[[Image:Google_maps_url.png]]&lt;br /&gt;
* you should get something like that:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
http://maps.google.com/maps?f=q&amp;amp;hl=fr&amp;amp;geocode=&amp;amp;q=besan%C3%A7on&amp;amp;ie=UTF8&amp;amp;ll=47.257796,6.025314&amp;amp;spn=0.216236,0.601501&amp;amp;z=11&amp;amp;iwloc=addr&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* the data between &#039;&#039;&amp;amp;ll=&#039;&#039; and &#039;&#039;&amp;amp;spn&#039;&#039; are the needed one (latitude/longitude)&lt;br /&gt;
* extract them and copy them in the &amp;quot;Edit&amp;quot; of this wiki page. Add it you wiki name and your town. For example:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;googlemap lat=&amp;quot;47&amp;quot; lon=&amp;quot;6&amp;quot; width=640 height=480 zoom=4&amp;gt;&lt;br /&gt;
...&lt;br /&gt;
Others coordinates&lt;br /&gt;
...&lt;br /&gt;
47.257796, 6.025314, [[User:YourID]] - Your Town&lt;br /&gt;
&amp;lt;/googlemap&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Category:Association]]&lt;/div&gt;</summary>
		<author><name>OlivierR</name></author>
	</entry>
	<entry>
		<id>http://wikilegacy.armadeus.com/index.php?title=Members&amp;diff=7401</id>
		<title>Members</title>
		<link rel="alternate" type="text/html" href="http://wikilegacy.armadeus.com/index.php?title=Members&amp;diff=7401"/>
		<updated>2009-09-25T07:16:48Z</updated>

		<summary type="html">&lt;p&gt;OlivierR: /* Google Map */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Google Map==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;googlemap lat=&amp;quot;47&amp;quot; lon=&amp;quot;6&amp;quot; width=640 height=480 zoom=4&amp;gt;&lt;br /&gt;
47.270377, 6.025314, [[User:JulienB]] Besancon&lt;br /&gt;
47.752598,7.301788, ARMadeus Systems&lt;br /&gt;
47.760791, 7.339897, [[User:Salocin68]] Mulhouse&lt;br /&gt;
47.734392,7.316975, [[User:FabienM]] Mulhouse&lt;br /&gt;
46.946161,7.517052, [[User:Jorasse]] Gümligen&lt;br /&gt;
47.681108, 7.390366, [[User:Carbure]] Helfranzkirch&lt;br /&gt;
47.436448, 8.429947, [[User:SonZerro]] Baden&lt;br /&gt;
44.653992, 6.176672, [[User:JulienN]] Chabottes&lt;br /&gt;
48.573342, 7.911476,  [[User:KroMignon]] Legelshurst&lt;br /&gt;
42.734405, 2.894211, ELIAUS Perpignan&lt;br /&gt;
47.653363, 6.862335, UTBM Belfort&lt;br /&gt;
45.689589, 5.026395, [[User:OlivierT]] St Bonnet de Mure&lt;br /&gt;
48.879619, 2.351074, Paris - 20 members&lt;br /&gt;
43.622159, 1.442642, Toulouse - 2 members&lt;br /&gt;
-21.115141, 55.536384, La Réunion - 1 member&lt;br /&gt;
14.551684, -60.912323, La Martinique - 1 member&lt;br /&gt;
48.682805, 2.169186, [[User:BrunoL]] Les Ulis&lt;br /&gt;
47.399744, 8.53775, Zurich - 1 member&lt;br /&gt;
46.810282, 7.151241, Fribourg&lt;br /&gt;
47.574904, 7.580566, Basel&lt;br /&gt;
&lt;br /&gt;
53.371859, -6.2677, Dublin - 1 member&lt;br /&gt;
50.637704, 5.608521, Liège - 1 member&lt;br /&gt;
50.67, 3.48, Velaines - 1 member&lt;br /&gt;
48.199964, 11.57959, Munich - 1 member&lt;br /&gt;
48.109588,-1.678752, Rennes - 1 member&lt;br /&gt;
47.750109,-3.366339, [[User:MatthieuT]] Lorient&lt;br /&gt;
48.70,2.03, [[User:JulienPeeters]] Chevreuse&lt;br /&gt;
45.190325, 5.700316, [[User:NicolasL]] Fontaine&lt;br /&gt;
49.279296, 2.472973 [[User:DavidC]] Nogent sur Oise&lt;br /&gt;
46.208644, 6.130027, [[User:EugeneR]] Genève&lt;br /&gt;
48.667158, 2.706585, [[User:BernardR]] Soignolles en Brie, France&lt;br /&gt;
45.188963, 5.709822, [[User:OlivierS]] Grenoble, France&lt;br /&gt;
47.214613,-0.737329, [[User:BrunoS]] Chemillé, France&lt;br /&gt;
47.225164,-1.556625, [[User:KevinP]] Nantes, France&lt;br /&gt;
43.609234, 1.442642, [[User:PierreBa]] Toulouse, France&lt;br /&gt;
41.668809,-0.87616, [[User:AntonioMB]] Zaragoza, España&lt;br /&gt;
49.200145, 0.407136, [[User:JeanFrancoisR]] - Asnières&lt;br /&gt;
48.109588,-1.678752, [[User:MichelTe]] - Rennes&lt;br /&gt;
49.163073, 2.550201, [[User:JulienBa]] - Pontarmé&lt;br /&gt;
43.488299, 5.494709, [[User:FrankA]] - Meyreuil&lt;br /&gt;
43.622159, 1.442642, [[User:PierreAlexandreS]] - Toulouse, France&lt;br /&gt;
51.46513, -0.9692, [[User:AlexG]] - Reading, UK&lt;br /&gt;
43.312439, 10.517693, [[User:PaoloB]] - Cecina, Italy&lt;br /&gt;
52.63, 4.75, Alkmaar - 1 member&lt;br /&gt;
47.201843, -0.991516, [[User:SamuelM]] - Beaupreau, France&lt;br /&gt;
50.776093, 14.632759, [[User:PetrD]] - Cvikov, ČR&lt;br /&gt;
48.250912, -4.283754, [[User:OlivierR]] - Brest, France&lt;br /&gt;
48.575244,-4.563446, [[User:JeanChristopheL]] - Brest, France&lt;br /&gt;
&amp;lt;/googlemap&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
===How to add your position===&lt;br /&gt;
* go to http://maps.google.com/&lt;br /&gt;
* type in the name of your town and launch &amp;quot;Search Google Maps&amp;quot;, for example:&lt;br /&gt;
[[Image:Google_maps_search.png]]&lt;br /&gt;
* right click on &amp;quot;Get URL of this page&amp;quot; and copy the URL&lt;br /&gt;
[[Image:Google_maps_url.png]]&lt;br /&gt;
* you should get something like that:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
http://maps.google.com/maps?f=q&amp;amp;hl=fr&amp;amp;geocode=&amp;amp;q=besan%C3%A7on&amp;amp;ie=UTF8&amp;amp;ll=47.257796,6.025314&amp;amp;spn=0.216236,0.601501&amp;amp;z=11&amp;amp;iwloc=addr&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* the data between &#039;&#039;&amp;amp;ll=&#039;&#039; and &#039;&#039;&amp;amp;spn&#039;&#039; are the needed one (latitude/longitude)&lt;br /&gt;
* extract them and copy them in the &amp;quot;Edit&amp;quot; of this wiki page. Add it you wiki name and your town. For example:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;googlemap lat=&amp;quot;47&amp;quot; lon=&amp;quot;6&amp;quot; width=640 height=480 zoom=4&amp;gt;&lt;br /&gt;
...&lt;br /&gt;
Others coordinates&lt;br /&gt;
...&lt;br /&gt;
47.257796, 6.025314, [[User:YourID]] - Your Town&lt;br /&gt;
&amp;lt;/googlemap&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Category:Association]]&lt;/div&gt;</summary>
		<author><name>OlivierR</name></author>
	</entry>
	<entry>
		<id>http://wikilegacy.armadeus.com/index.php?title=User:OlivierR&amp;diff=7399</id>
		<title>User:OlivierR</title>
		<link rel="alternate" type="text/html" href="http://wikilegacy.armadeus.com/index.php?title=User:OlivierR&amp;diff=7399"/>
		<updated>2009-09-24T17:48:30Z</updated>

		<summary type="html">&lt;p&gt;OlivierR: /* Objectifs : */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Bonjour,&lt;br /&gt;
Je suis enseignant-chercheur à l&#039;ENSIETA et je souhaite porter Armadeus dans le cursus d&#039;enseignement. &lt;br /&gt;
C&#039;est à mon avis une excellente plateforme pour les systèmes embarqués. &lt;br /&gt;
Bravo à toute l&#039;équipe de s&#039;appuyer sur les outils libres et linux.&lt;br /&gt;
&lt;br /&gt;
== &#039;&#039;&#039;Mes compétences :&#039;&#039;&#039; ==&lt;br /&gt;
* Réseaux / Télécommuncations &lt;br /&gt;
* programmation en C/C++/Java/Python  &lt;br /&gt;
* GNU Linux Debian&lt;br /&gt;
&lt;br /&gt;
== &#039;&#039;&#039;Objectifs :&#039;&#039;&#039; ==&lt;br /&gt;
* développer mes compétences pour l&#039;embarqué &lt;br /&gt;
* développer des projets armadeus avec mes étudiants !&lt;br /&gt;
* m&#039;éclater avec une plateforme format carte de crédit !!&lt;/div&gt;</summary>
		<author><name>OlivierR</name></author>
	</entry>
	<entry>
		<id>http://wikilegacy.armadeus.com/index.php?title=User:OlivierR&amp;diff=7398</id>
		<title>User:OlivierR</title>
		<link rel="alternate" type="text/html" href="http://wikilegacy.armadeus.com/index.php?title=User:OlivierR&amp;diff=7398"/>
		<updated>2009-09-24T17:48:20Z</updated>

		<summary type="html">&lt;p&gt;OlivierR: /* Mes compétences : */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Bonjour,&lt;br /&gt;
Je suis enseignant-chercheur à l&#039;ENSIETA et je souhaite porter Armadeus dans le cursus d&#039;enseignement. &lt;br /&gt;
C&#039;est à mon avis une excellente plateforme pour les systèmes embarqués. &lt;br /&gt;
Bravo à toute l&#039;équipe de s&#039;appuyer sur les outils libres et linux.&lt;br /&gt;
&lt;br /&gt;
== &#039;&#039;&#039;Mes compétences :&#039;&#039;&#039; ==&lt;br /&gt;
* Réseaux / Télécommuncations &lt;br /&gt;
* programmation en C/C++/Java/Python  &lt;br /&gt;
* GNU Linux Debian&lt;br /&gt;
&lt;br /&gt;
== &#039;&#039;&#039;Objectifs :&#039;&#039;&#039; ==&lt;br /&gt;
- développer mes compétences pour l&#039;embarqué &lt;br /&gt;
- développer des projets armadeus avec mes étudiants !&lt;br /&gt;
- m&#039;éclater avec une plateforme format carte de crédit !!&lt;/div&gt;</summary>
		<author><name>OlivierR</name></author>
	</entry>
	<entry>
		<id>http://wikilegacy.armadeus.com/index.php?title=User:OlivierR&amp;diff=7397</id>
		<title>User:OlivierR</title>
		<link rel="alternate" type="text/html" href="http://wikilegacy.armadeus.com/index.php?title=User:OlivierR&amp;diff=7397"/>
		<updated>2009-09-24T17:48:07Z</updated>

		<summary type="html">&lt;p&gt;OlivierR: New page: Bonjour, Je suis enseignant-chercheur à l&amp;#039;ENSIETA et je souhaite porter Armadeus dans le cursus d&amp;#039;enseignement.  C&amp;#039;est à mon avis une excellente plateforme pour les systèmes embarqués....&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Bonjour,&lt;br /&gt;
Je suis enseignant-chercheur à l&#039;ENSIETA et je souhaite porter Armadeus dans le cursus d&#039;enseignement. &lt;br /&gt;
C&#039;est à mon avis une excellente plateforme pour les systèmes embarqués. &lt;br /&gt;
Bravo à toute l&#039;équipe de s&#039;appuyer sur les outils libres et linux.&lt;br /&gt;
&lt;br /&gt;
== &#039;&#039;&#039;Mes compétences :&#039;&#039;&#039; ==&lt;br /&gt;
- Réseaux / Télécommuncations &lt;br /&gt;
- programmation en C/C++/Java/Python  &lt;br /&gt;
- GNU Linux Debian&lt;br /&gt;
&lt;br /&gt;
== &#039;&#039;&#039;Objectifs :&#039;&#039;&#039; ==&lt;br /&gt;
- développer mes compétences pour l&#039;embarqué &lt;br /&gt;
- développer des projets armadeus avec mes étudiants !&lt;br /&gt;
- m&#039;éclater avec une plateforme format carte de crédit !!&lt;/div&gt;</summary>
		<author><name>OlivierR</name></author>
	</entry>
	<entry>
		<id>http://wikilegacy.armadeus.com/index.php?title=Members&amp;diff=7394</id>
		<title>Members</title>
		<link rel="alternate" type="text/html" href="http://wikilegacy.armadeus.com/index.php?title=Members&amp;diff=7394"/>
		<updated>2009-09-24T15:41:10Z</updated>

		<summary type="html">&lt;p&gt;OlivierR: /* Google Map */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Google Map==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;googlemap lat=&amp;quot;47&amp;quot; lon=&amp;quot;6&amp;quot; width=640 height=480 zoom=4&amp;gt;&lt;br /&gt;
47.270377, 6.025314, [[User:JulienB]] Besancon&lt;br /&gt;
47.752598,7.301788, ARMadeus Systems&lt;br /&gt;
47.760791, 7.339897, [[User:Salocin68]] Mulhouse&lt;br /&gt;
47.734392,7.316975, [[User:FabienM]] Mulhouse&lt;br /&gt;
46.946161,7.517052, [[User:Jorasse]] Gümligen&lt;br /&gt;
47.681108, 7.390366, [[User:Carbure]] Helfranzkirch&lt;br /&gt;
47.436448, 8.429947, [[User:SonZerro]] Baden&lt;br /&gt;
44.653992, 6.176672, [[User:JulienN]] Chabottes&lt;br /&gt;
48.573342, 7.911476,  [[User:KroMignon]] Legelshurst&lt;br /&gt;
42.734405, 2.894211, ELIAUS Perpignan&lt;br /&gt;
47.653363, 6.862335, UTBM Belfort&lt;br /&gt;
45.689589, 5.026395, [[User:OlivierT]] St Bonnet de Mure&lt;br /&gt;
48.879619, 2.351074, Paris - 20 members&lt;br /&gt;
43.622159, 1.442642, Toulouse - 2 members&lt;br /&gt;
-21.115141, 55.536384, La Réunion - 1 member&lt;br /&gt;
14.551684, -60.912323, La Martinique - 1 member&lt;br /&gt;
48.682805, 2.169186, [[User:BrunoL]] Les Ulis&lt;br /&gt;
47.399744, 8.53775, Zurich - 1 member&lt;br /&gt;
46.810282, 7.151241, Fribourg&lt;br /&gt;
47.574904, 7.580566, Basel&lt;br /&gt;
&lt;br /&gt;
53.371859, -6.2677, Dublin - 1 member&lt;br /&gt;
50.637704, 5.608521, Liège - 1 member&lt;br /&gt;
50.67, 3.48, Velaines - 1 member&lt;br /&gt;
48.199964, 11.57959, Munich - 1 member&lt;br /&gt;
48.109588,-1.678752, Rennes - 1 member&lt;br /&gt;
47.750109,-3.366339, [[User:MatthieuT]] Lorient&lt;br /&gt;
48.70,2.03, [[User:JulienPeeters]] Chevreuse&lt;br /&gt;
45.190325, 5.700316, [[User:NicolasL]] Fontaine&lt;br /&gt;
49.279296, 2.472973 [[User:DavidC]] Nogent sur Oise&lt;br /&gt;
46.208644, 6.130027, [[User:EugeneR]] Genève&lt;br /&gt;
48.667158, 2.706585, [[User:BernardR]] Soignolles en Brie, France&lt;br /&gt;
45.188963, 5.709822, [[User:OlivierS]] Grenoble, France&lt;br /&gt;
47.214613,-0.737329, [[User:BrunoS]] Chemillé, France&lt;br /&gt;
47.225164,-1.556625, [[User:KevinP]] Nantes, France&lt;br /&gt;
43.609234, 1.442642, [[User:PierreBa]] Toulouse, France&lt;br /&gt;
41.668809,-0.87616, [[User:AntonioMB]] Zaragoza, España&lt;br /&gt;
49.200145, 0.407136, [[User:JeanFrancoisR]] - Asnières&lt;br /&gt;
48.109588,-1.678752, [[User:MichelTe]] - Rennes&lt;br /&gt;
49.163073, 2.550201, [[User:JulienBa]] - Pontarmé&lt;br /&gt;
43.488299, 5.494709, [[User:FrankA]] - Meyreuil&lt;br /&gt;
43.622159, 1.442642, [[User:PierreAlexandreS]] - Toulouse, France&lt;br /&gt;
51.46513, -0.9692, [[User:AlexG]] - Reading, UK&lt;br /&gt;
43.312439, 10.517693, [[User:PaoloB]] - Cecina, Italy&lt;br /&gt;
52.63, 4.75, Alkmaar - 1 member&lt;br /&gt;
47.201843, -0.991516, [[User:SamuelM]] - Beaupreau, France&lt;br /&gt;
50.776093, 14.632759, [[User:PetrD]] - Cvikov, ČR&lt;br /&gt;
48.424245, -4.469805, [[User:OlivierR]] - Brest, France&lt;br /&gt;
&amp;lt;/googlemap&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
===How to add your position===&lt;br /&gt;
* go to http://maps.google.com/&lt;br /&gt;
* type in the name of your town and launch &amp;quot;Search Google Maps&amp;quot;, for example:&lt;br /&gt;
[[Image:Google_maps_search.png]]&lt;br /&gt;
* right click on &amp;quot;Get URL of this page&amp;quot; and copy the URL&lt;br /&gt;
[[Image:Google_maps_url.png]]&lt;br /&gt;
* you should get something like that:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
http://maps.google.com/maps?f=q&amp;amp;hl=fr&amp;amp;geocode=&amp;amp;q=besan%C3%A7on&amp;amp;ie=UTF8&amp;amp;ll=47.257796,6.025314&amp;amp;spn=0.216236,0.601501&amp;amp;z=11&amp;amp;iwloc=addr&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* the data between &#039;&#039;&amp;amp;ll=&#039;&#039; and &#039;&#039;&amp;amp;spn&#039;&#039; are the needed one (latitude/longitude)&lt;br /&gt;
* extract them and copy them in the &amp;quot;Edit&amp;quot; of this wiki page. Add it you wiki name and your town. For example:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;googlemap lat=&amp;quot;47&amp;quot; lon=&amp;quot;6&amp;quot; width=640 height=480 zoom=4&amp;gt;&lt;br /&gt;
...&lt;br /&gt;
Others coordinates&lt;br /&gt;
...&lt;br /&gt;
47.257796, 6.025314, [[User:YourID]] - Your Town&lt;br /&gt;
&amp;lt;/googlemap&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Category:Association]]&lt;/div&gt;</summary>
		<author><name>OlivierR</name></author>
	</entry>
	<entry>
		<id>http://wikilegacy.armadeus.com/index.php?title=MemberList&amp;diff=7393</id>
		<title>MemberList</title>
		<link rel="alternate" type="text/html" href="http://wikilegacy.armadeus.com/index.php?title=MemberList&amp;diff=7393"/>
		<updated>2009-09-24T15:38:39Z</updated>

		<summary type="html">&lt;p&gt;OlivierR: /* Here is the list of the (active) members and their skills */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Here is the list of the (active) members and their skills==&lt;br /&gt;
&lt;br /&gt;
This list is maintained by the users themself.&lt;br /&gt;
&lt;br /&gt;
*0: Novice&lt;br /&gt;
*1: Notions. At least one successfull experiment&lt;br /&gt;
*2: Confirmed&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellpadding=&amp;quot;5&amp;quot; cellspacing=&amp;quot;0&amp;quot; summary=&amp;quot;Signal connections&amp;quot;&lt;br /&gt;
|- style=&amp;quot;background:#efefef;&amp;quot;&lt;br /&gt;
! &#039;&#039;&#039;Name / IRC Nickname&#039;&#039;&#039; || &#039;&#039;&#039;Linux Apps&#039;&#039;&#039;|| &#039;&#039;&#039;Linux Drivers&#039;&#039;&#039;|| &#039;&#039;&#039;FPGA&#039;&#039;&#039; || &#039;&#039;&#039;Board Design&#039;&#039;&#039; || &#039;&#039;&#039;Projet/Domain&#039;&#039;&#039;&lt;br /&gt;
|----------------&lt;br /&gt;
|[[User:Salocin68|Nicolas Colombain / Salocin]] || 1 || 1 || 1 || 2 || domotics&lt;br /&gt;
|----------------&lt;br /&gt;
|[[User:JulienB|Julien Boibessot / Artemys]] || 2 || 2 || 0 || 1 || multimedia&lt;br /&gt;
|----------------&lt;br /&gt;
|[[User:JeanBaptisteM|Jean-Baptiste Mayer / JiBee]] || 2 || 1 || 1 || 1 || robotics&lt;br /&gt;
|----------------&lt;br /&gt;
|[[User:NicolasA|Nicolas Aguirre]] || 2 || 0 || 1 || 1 || multimedia&lt;br /&gt;
|----------------&lt;br /&gt;
|[[User:BenoitC|Benoît Canet]] || 2 || 0 || 0 || 0 || multimedia&lt;br /&gt;
|----------------&lt;br /&gt;
|[[User:SonZerro|Sonzerro]] || 0 || 0 || 1 || 2 || domotics&lt;br /&gt;
|----------------&lt;br /&gt;
|[[User:HenriG|Henri Geist]] || 1 || 1 || 0 || 1 || robotics&lt;br /&gt;
|----------------&lt;br /&gt;
|[[User:BorredonB|Bernard Borredon]] || 2 || 1 || 0 || 1 || domotics&lt;br /&gt;
|----------------&lt;br /&gt;
|[[User:ThomasB|Thomas Bores]] || 2 || 0 || 0 || 1 || Entertainment&lt;br /&gt;
|----------------&lt;br /&gt;
|[[User:FabriceM|Fabrice Mousset / KroMignon]] || 1 || 1 || 2 || 1 || Domotics &amp;amp; multimedia&lt;br /&gt;
|----------------&lt;br /&gt;
|[[User:AmineH|Amine EL HEDADI]] || 2 || 2 || 0 || 0 || domotics &amp;amp; robotics&lt;br /&gt;
|----------------&lt;br /&gt;
|[[User:PhilippeM|Philippe Monteil]] || 2 || 0 || 0 || 0 || multimedia&lt;br /&gt;
|----------------&lt;br /&gt;
|[[User:CedricZ|Cédric Zmyj]] || 0 || 0 || 0 || 0 || domotics &amp;amp; robotics&lt;br /&gt;
|----------------&lt;br /&gt;
|[[User:JeanMichelN|Jean Michel Naimo / jeanmi12 ]] || 2 || 1 || 1 || 1 || Domotics &amp;amp; entertainment&lt;br /&gt;
|----------------&lt;br /&gt;
|[[User:OlivierC|Olivier Coutanceau]] || 1 || 0 || 0 || 0 || multimedia&lt;br /&gt;
|----------------&lt;br /&gt;
|[[User:ArnaudC|Arnaud COFFINET]] || 0 || 0 || 1 || 2 || multimedia &amp;amp; domotics&lt;br /&gt;
|----------------&lt;br /&gt;
|[[User:SylvainP|Sylvain PARRINO]] || 2 || 1 || 0 || 0 || robotics&lt;br /&gt;
|----------------&lt;br /&gt;
|[[User:AurelienH|Aurélien HIRON]] || 2 || 0 || 0 || 1 || robotics&lt;br /&gt;
|----------------&lt;br /&gt;
|[[User:GuillaumeT|Guillaume TRANNOY]] || 0 || 0 || 0 || 2 || domotics &amp;amp; robotics&lt;br /&gt;
|----------------&lt;br /&gt;
|[[User:JulienN|Julien NICOLAS / jujun]] || 2 || 1 || 0 || 1 || multimedia &amp;amp; network&lt;br /&gt;
|----------------&lt;br /&gt;
|[[User:StephaneF|Stéphane Falck]] || 0 || 0 || 0 || 0 || multimedia &amp;amp; robotics &amp;amp; domotics&lt;br /&gt;
|----------------&lt;br /&gt;
|[[User:GillesD|Gilles DUSSIN/ Sellig]] || 1 || 0 || 1 || 1 || robotics&lt;br /&gt;
|----------------&lt;br /&gt;
|[[User:MaximeL|Maxime Liron]] || 0 || 0 || 0 || 0 || domotics, robotics &amp;amp; multimedia&lt;br /&gt;
|----------------&lt;br /&gt;
|[[User:NicolasC|Nicolas CHARLERY/ realniko]] || 2 || 0 || 0 || 0 || electronic&lt;br /&gt;
|----------------&lt;br /&gt;
|[[User:BenoitJ|Benoit JESTER]] || 0 || 0 || 0 || 0 || robotics &lt;br /&gt;
|----------------&lt;br /&gt;
|[[User:FabienM|Fabien MARTEAU/ FabM]] || 1 || 2 || 1 || 1 || robotics,domotics &lt;br /&gt;
|----------------&lt;br /&gt;
|[[User:XavierA|Xavier AZNAR]] || 1 || 1 || 0 || 0 || environment, entertainment, domotic &lt;br /&gt;
|----------------&lt;br /&gt;
|[[User:AlbericA|Albéric AUBLANC / PoueT]] || 2 || 0 || 1 || 0 || domotics &amp;amp; multimedia, robotics, entertainment, &lt;br /&gt;
|----------------&lt;br /&gt;
|[[User:FredericB| Frédéric Blain / creber]] || 2 || 1 || 0 || 0 || system, domotics&lt;br /&gt;
|----------------&lt;br /&gt;
|[[User:JeanBaptisteMa| Jean-Baptiste Maillet]] || 2 || 1 || 0 || 0 || system&lt;br /&gt;
|----------------&lt;br /&gt;
|[[User:JeanFrancoisR| Jean-François Rousval]] || 2 || 1 || 0 || 1 || &lt;br /&gt;
|----------------&lt;br /&gt;
|[[User:JulienPeeters| Julien Peeters]] || 2 || 1 || 0 || 0 || domotics, real-time, entertainment, network&lt;br /&gt;
|----------------&lt;br /&gt;
|[[User:YoannC| Yoann Congal / Alpheb]] || 0 || 0 || 0 || 1 || robotics&lt;br /&gt;
|----------------&lt;br /&gt;
|[[User:MatthieuT| Matthieu Texier / weeber]] || 1 || 0 || 1 || 0 || robotics, real-time&lt;br /&gt;
|----------------&lt;br /&gt;
|[[User:MartialG| Martial Guex]] || 2 || 1 || 1 || 2 || transceiver RF, real-time, wireless&lt;br /&gt;
|----------------&lt;br /&gt;
|[[User:NicolasL| Nicolas Lantz]] || 2 || 2 || 1 || 1 ||&lt;br /&gt;
|----------------&lt;br /&gt;
|[[User:GuillaumeD| Guillaume DELVIT]] || 1 || 1 || 1 || 1 || system, asynchronous CPU&lt;br /&gt;
|----------------&lt;br /&gt;
|[[User:BernardR|Bernard REMOND ]] || x || x || x || x || &lt;br /&gt;
|----------------&lt;br /&gt;
|[[User:SamirH| Samir HAMNACHE]] || 0 || 0 || 0 || 1 || électronique&lt;br /&gt;
|----------------&lt;br /&gt;
|[[User:OlivierT|Olivier TARDIEU]] || 0 || 0 || 0 || 1 || électronique,robotics,domotics &lt;br /&gt;
|----------------&lt;br /&gt;
|[[User:ThibautR|Thibault Rétornaz]] || 1 || 1 || 1 || 0 || bio-med, électronique&lt;br /&gt;
|----------------&lt;br /&gt;
|[[User:BrunoS|Bruno Suarez]] || 2 || 0 || 0 || 0 || bio-med, électronique&lt;br /&gt;
|----------------&lt;br /&gt;
|[[User:guillaumeDe|Guillaume Denis]] || 0 || 0 || 2 || 1 || Electronique numérique, FPGA&lt;br /&gt;
|----------------&lt;br /&gt;
|[[User:KevinP|Kévin PETIT]] || 1 || 0 || 1 || 1 || Multimedia&lt;br /&gt;
|----------------&lt;br /&gt;
|[[User:PierreBa|Pierre Baudemont / b4ud3]] || 2 || 0 || 1 || 0 || domotics, robotics&lt;br /&gt;
|----------------&lt;br /&gt;
|[[User:BrunoL|Bruno Landré]] || 0 || 0 || 0 || 0 || robotics&lt;br /&gt;
|----------------&lt;br /&gt;
|[[User:AntonioMB|Antonio Meléndez]] || 0 || 0 || 1 || 2 || domotics, robotics, eletcronics&lt;br /&gt;
|----------------&lt;br /&gt;
|[[User:MichelTe|Michel Le Mer]] || 0 || 0 || 2 || 2 || electronics, software&lt;br /&gt;
|----------------&lt;br /&gt;
|[[User:JulienBa|Julien Baley]] || 0 || 0 || 0 || 0 || &lt;br /&gt;
|----------------&lt;br /&gt;
|[[User:FrankA|Frank ANJEAUX]] || 1 || 0 || 0 || 1 || software,robotics, domotics, electronics&lt;br /&gt;
|----------------&lt;br /&gt;
|[[User:JulienViaud|Julien viaud/polric]] || 2 || 0 || 1 || 1 || &lt;br /&gt;
|----------------&lt;br /&gt;
|[[User:NicolasCa|Nicolas CARTIER]] || 1 || 1 || 0 || 2 || domotics &amp;amp; robotics&lt;br /&gt;
|----------------&lt;br /&gt;
|[[User:PierreAlexandreS|Pierre Alexandre SCHEMBRI]] || 2 || 1 || 2 || 2 || electronics, board design, embedded software, FPGA, robotics, low power&lt;br /&gt;
|----------------&lt;br /&gt;
|[[User:AlexG|Alex GONZALEZ]] || 2 || 2 || 0 || 1 || telecommunications, network &amp;amp; multimedia&lt;br /&gt;
|----------------&lt;br /&gt;
|[[User:JulienL|Julien Lefrique / apapi]] || 1 || 0 || 1 || 1 ||&lt;br /&gt;
|----------------&lt;br /&gt;
|[[User:PaoloB|Paolo Bernini / nihil84]] || 2 || 1 || 0 || 0 || robotics, real-time&lt;br /&gt;
|----------------&lt;br /&gt;
|[[User:MichielE|Michiel Ettema]] || 0 || 0 || 0 || 1 || telecommunications, networking&lt;br /&gt;
|----------------&lt;br /&gt;
|[[User:NicolasD|Nicolas Duclos]] || 2 || 1 || 0 || 0 || telecommunications, domotics and funs&lt;br /&gt;
|----------------&lt;br /&gt;
|[[User:SebastienP|Sebastien Philippe]] || 1 || 2 || 1 || 2 || electronics, board design, embedded linux&lt;br /&gt;
|----------------&lt;br /&gt;
|[[User:PaulM|Paul MONSINJON]] || 1 || 1 || 2 || 1 || robotics, fpga, embedded linux&lt;br /&gt;
|----------------&lt;br /&gt;
|[[User:OlivierR|Olivier REYNET]] || 1 || 0 || 0 || 0 || robotics, linux, networking&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==Links==&lt;br /&gt;
* [[Members | Geographical position of the members]]&lt;br /&gt;
&lt;br /&gt;
[[Category:Association]]&lt;/div&gt;</summary>
		<author><name>OlivierR</name></author>
	</entry>
</feed>