<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
  <channel>
    <title>2011s on Mika Tuupola</title>
    <link>https://www.appelsiini.net/2011/</link>
    <description>Recent content in 2011s on Mika Tuupola</description>
    <generator>Hugo -- gohugo.io</generator>
    <language>en-us</language>
    <lastBuildDate>Sat, 19 Nov 2011 00:00:00 +0000</lastBuildDate>
    
	<atom:link href="https://www.appelsiini.net/2011/index.xml" rel="self" type="application/rss+xml" />
    
    
    <item>
      <title>Simple Serial Communications With AVR libc</title>
      <link>https://www.appelsiini.net/2011/simple-usart-with-avr-libc/</link>
      <pubDate>Sat, 19 Nov 2011 00:00:00 +0000</pubDate>
      
      <guid>https://www.appelsiini.net/2011/simple-usart-with-avr-libc/</guid>
      <description>&lt;p&gt;I like to use various Arduino boards for AVR development. What I do not
like are the Arduino libraries. They are often just
&lt;a href=&#34;https://github.com/arduino/Arduino/tree/master/libraries/EEPROM&#34;&gt;wrappers around libc functions&lt;/a&gt;
or &lt;a href=&#34;https://github.com/arduino/Arduino/blob/master/hardware/arduino/cores/arduino/Print.cpp&#34;&gt;rewrites of functions libc already provides&lt;/a&gt;.
Serial communications is one good example. Arduino provides you with its
own implementation of &lt;code&gt;Serial.print()&lt;/code&gt;,
&lt;code&gt;Serial.println()&lt;/code&gt; and &lt;code&gt;Serial.read()&lt;/code&gt; methods. At
the same time AVR Libc has proven &lt;code&gt;printf()&lt;/code&gt;,
&lt;code&gt;puts()&lt;/code&gt; and &lt;code&gt;getchar()&lt;/code&gt; functions. This article
explains easy implementation of libc functions used for serial
communications.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;If you do not have much experience in programming it is probably
better to stick with Arduino libraries.&lt;/strong&gt; They are good at hiding
some of the confusing features of embedded programming. However changes
are you grow out of them after few projects. Atmel datasheets are not as
confusing as they first appear. You might also want to check the
&lt;a href=&#34;https://github.com/tuupola/avr_demo/tree/master/blog/simple_usart&#34;&gt;finished code&lt;/a&gt;
of this article.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3 id=&#34;configuring-uart&#34;&gt;Configuring UART&lt;/h3&gt;
&lt;p&gt;AVR microcontrollers have three control and status registers. Register
&lt;code&gt;UCSR0A&lt;/code&gt; mostly contains status data. &lt;code&gt;UCSR0B&lt;/code&gt; and
&lt;code&gt;UCSR0C&lt;/code&gt; contain all the configuration settings. See the
&lt;a href=&#34;#registers&#34;&gt;tables in the end of article&lt;/a&gt; for all possible values.&lt;/p&gt;
&lt;p&gt;AVR Libc provides &lt;a href=&#34;http://www.nongnu.org/avr-libc/user-manual/group__util__setbaud.html&#34;&gt;helper macros for baud rate
calculations&lt;/a&gt;.
Header file requires &lt;code&gt;F_CPU&lt;/code&gt; and &lt;code&gt;BAUD&lt;/code&gt; to be
defined. After including the header file &lt;code&gt;UBRRL_VALUE&lt;/code&gt;,
&lt;code&gt;UBRRH_VALUE&lt;/code&gt; and &lt;code&gt;USE_2X&lt;/code&gt; are defined. First
two are used to set UART speed. Last one is used to determine if UART
has to be configured to run in double speed mode with given baud rate.&lt;/p&gt;
&lt;p&gt;&lt;code&gt;UCSZ20&lt;/code&gt; &lt;code&gt;UCSZ01&lt;/code&gt; and &lt;code&gt;UCSZ00&lt;/code&gt; control
the data size. Possible sizes are 5-bit (000), 6-bit (001), 7-bit (010),
8-bit (011) and 9-bit (111). Most common used data size is 8-bit.&lt;/p&gt;
&lt;p&gt;With above bits we can set most common configuration: no parity, 8 data
bits, 1 stop bit.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-c&#34; data-lang=&#34;c&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;#define F_CPU 16000000UL
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;#define BAUD 9600
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;#include&lt;/span&gt; &lt;span style=&#34;color:#75715e&#34;&gt;&amp;lt;util/setbaud.h&amp;gt;&lt;/span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;void&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;uart_init&lt;/span&gt;(&lt;span style=&#34;color:#66d9ef&#34;&gt;void&lt;/span&gt;) {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    UBRR0H &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; UBRRH_VALUE;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    UBRR0L &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; UBRRL_VALUE;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;#if USE_2X
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;    UCSR0A &lt;span style=&#34;color:#f92672&#34;&gt;|=&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;_BV&lt;/span&gt;(U2X0);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;#else
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;    UCSR0A &lt;span style=&#34;color:#f92672&#34;&gt;&amp;amp;=&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;~&lt;/span&gt;(&lt;span style=&#34;color:#a6e22e&#34;&gt;_BV&lt;/span&gt;(U2X0));
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;#endif
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    UCSR0C &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;_BV&lt;/span&gt;(UCSZ01) &lt;span style=&#34;color:#f92672&#34;&gt;|&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;_BV&lt;/span&gt;(UCSZ00); &lt;span style=&#34;color:#75715e&#34;&gt;/* 8-bit data */&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    UCSR0B &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;_BV&lt;/span&gt;(RXEN0) &lt;span style=&#34;color:#f92672&#34;&gt;|&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;_BV&lt;/span&gt;(TXEN0);   &lt;span style=&#34;color:#75715e&#34;&gt;/* Enable RX and TX */&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id=&#34;writing-and-reading-from-uart&#34;&gt;Writing and Reading From UART&lt;/h3&gt;
&lt;p&gt;You can transmit data to UART by writing a byte to USART Data Register
&lt;code&gt;UDR0&lt;/code&gt;. First you have to make sure UART is ready to transmit
new data. You can wait until USART Data Register Empty &lt;code&gt;UDRE&lt;/code&gt;
flag is set. Alternatively you can wait after each byte to transmission
be ready. USART Transmit Complete &lt;code&gt;TXC0&lt;/code&gt; is set when
transmission is ready.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-c&#34; data-lang=&#34;c&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;void&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;uart_putchar&lt;/span&gt;(&lt;span style=&#34;color:#66d9ef&#34;&gt;char&lt;/span&gt; c) {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;   &lt;span style=&#34;color:#a6e22e&#34;&gt;loop_until_bit_is_set&lt;/span&gt;(UCSR0A, UDRE0); &lt;span style=&#34;color:#75715e&#34;&gt;/* Wait until data register empty. */&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;   UDR0 &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; c;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;void&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;uart_putchar&lt;/span&gt;(&lt;span style=&#34;color:#66d9ef&#34;&gt;char&lt;/span&gt; c) {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;   UDR0 &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; c;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;   &lt;span style=&#34;color:#a6e22e&#34;&gt;loop_until_bit_is_set&lt;/span&gt;(UCSR0A, TXC0); &lt;span style=&#34;color:#75715e&#34;&gt;/* Wait until transmission ready. */&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;You can receive data from UART by reading a byte from USART Data
Register &lt;code&gt;UDR0&lt;/code&gt;. USART Receive Complete &lt;code&gt;RXC0&lt;/code&gt;
flag is set if to unread data exists in data register.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-c&#34; data-lang=&#34;c&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;char&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;uart_getchar&lt;/span&gt;(&lt;span style=&#34;color:#66d9ef&#34;&gt;void&lt;/span&gt;) {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#a6e22e&#34;&gt;loop_until_bit_is_set&lt;/span&gt;(UCSR0A, RXC0); &lt;span style=&#34;color:#75715e&#34;&gt;/* Wait until data exists. */&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;return&lt;/span&gt; UDR0;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id=&#34;redirecting-stdin-and-stdout-to-uart&#34;&gt;Redirecting STDIN and STDOUT to UART&lt;/h3&gt;
&lt;p&gt;&lt;a href=&#34;http://www.nongnu.org/avr-libc/user-manual/group__avr__stdio.html&#34;&gt;FDEV_SETUP_STREAM&lt;/a&gt;
macro can be used to setup a buffer which is valid for stdio operations.
Initialized buffer will be of type &lt;code&gt;FILE&lt;/code&gt;. You can define
separate buffers for input and output. Alternatively you can define only
one buffer which works for both input and output. First and second
parameters are names of the functions which will be called when data is
either read from or written to the buffer.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-c&#34; data-lang=&#34;c&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;FILE uart_output &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;FDEV_SETUP_STREAM&lt;/span&gt;(uart_putchar, NULL, _FDEV_SETUP_WRITE);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;FILE uart_input &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;FDEV_SETUP_STREAM&lt;/span&gt;(NULL, uart_getchar, _FDEV_SETUP_READ);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;FILE uart_io &lt;span style=&#34;color:#a6e22e&#34;&gt;FDEV_SETUP_STREAM&lt;/span&gt;(uart_putchar, uart_getchar, _FDEV_SETUP_RW);
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;To prepare our &lt;code&gt;uart_putchar&lt;/code&gt; and &lt;code&gt;uart_getchar&lt;/code&gt;
function to be used with streams we have to change the definition a bit.
To properly format output we also force adding a carriage return after
newline has been sent.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-c&#34; data-lang=&#34;c&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;void&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;uart_putchar&lt;/span&gt;(&lt;span style=&#34;color:#66d9ef&#34;&gt;char&lt;/span&gt; c, FILE &lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;stream) {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;if&lt;/span&gt; (c &lt;span style=&#34;color:#f92672&#34;&gt;==&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;\n&amp;#39;&lt;/span&gt;) {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#a6e22e&#34;&gt;uart_putchar&lt;/span&gt;(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;\r&amp;#39;&lt;/span&gt;, stream);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    }
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#a6e22e&#34;&gt;loop_until_bit_is_set&lt;/span&gt;(UCSR0A, UDRE0);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    UDR0 &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; c;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;char&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;uart_getchar&lt;/span&gt;(FILE &lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;stream) {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#a6e22e&#34;&gt;loop_until_bit_is_set&lt;/span&gt;(UCSR0A, RXC0); &lt;span style=&#34;color:#75715e&#34;&gt;/* Wait until data exists. */&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;return&lt;/span&gt; UDR0;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Now we can redirect both STDIN and STDOUT to UART. This enables us to
use AVR Libc provided functions to read and write to serial port.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-c&#34; data-lang=&#34;c&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;int&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;main&lt;/span&gt;(&lt;span style=&#34;color:#66d9ef&#34;&gt;void&lt;/span&gt;) {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#a6e22e&#34;&gt;uart_init&lt;/span&gt;();
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    stdout &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;&amp;amp;&lt;/span&gt;uart_output;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    stdin  &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;&amp;amp;&lt;/span&gt;uart_input;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;char&lt;/span&gt; input;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;while&lt;/span&gt;(&lt;span style=&#34;color:#ae81ff&#34;&gt;1&lt;/span&gt;) {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#a6e22e&#34;&gt;puts&lt;/span&gt;(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;Hello world!&amp;#34;&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        input &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;getchar&lt;/span&gt;();
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#a6e22e&#34;&gt;printf&lt;/span&gt;(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;You wrote %c&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;\n&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;&lt;/span&gt;, input);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    }
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;return&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;0&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;a name=&#34;registers&#34;&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h3 id=&#34;control-and-status-registers&#34;&gt;Control and Status Registers&lt;/h3&gt;
&lt;table class=&#34;table table-hover table-bordered table-striped&#34;&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;
UCSR0A Bit #
&lt;/th&gt;
&lt;th&gt;
Name
&lt;/th&gt;
&lt;th&gt;
Description
&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;
bit 7
&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;RXC0&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;
USART Receive Complete. Set when data is available and the data register
has not be read yet.
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
bit 6
&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;TXC0&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;
USART Transmit Complete. Set when all data has transmitted.
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
bit 5
&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;UDRE0&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;
USART Data Register Empty. Set when the &lt;code&gt;UDR0&lt;/code&gt; register is
empty and new data can be transmitted.
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
bit 4
&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;FE0&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;
Frame Error. Set when next byte in the &lt;code&gt;UDR0&lt;/code&gt; register has a
framing error.
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
bit 3
&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;DOR0&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;
Data OverRun. Set when the &lt;code&gt;UDR0&lt;/code&gt; was not read before the
next frame arrived.
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
bit 2
&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;UPE0&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;
USART Parity Error. Set when next frame in the &lt;code&gt;UDR0&lt;/code&gt; has a
parity error.
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
bit 1
&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;U2X0&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;
USART Double Transmission Speed. When set decreases the bit time by half
doubling the speed.
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
bit 0
&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;MPCM0&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;
Multi-processor Communication Mode. When set incoming data is ignored if
no addressing information is provided.
&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;table class=&#34;table table-hover table-bordered table-striped&#34;&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;
UCSR0B Bit #
&lt;/th&gt;
&lt;th&gt;
Name
&lt;/th&gt;
&lt;th&gt;
Description
&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;
bit 7
&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;RXCIE0&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;
RX Complete Interrupt Enable. Set to allow receive complete interrupts.
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
bit 6
&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;TXCIE0&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;
TX Complete Interrupt Enable. Set to allow transmission complete
interrupts.
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
bit 5
&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;UDRIE0&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;
USART Data Register Empty Interrupt Enable. Set to allow data register
empty interrupts.
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
bit 4
&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;RXEN0&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;
Receiver Enable. Set to enable receiver.
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
bit 3
&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;TXEN0&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;
Transmitter enable. Set to enable transmitter.
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
bit 2
&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;UCSZ20&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;
USART Character Size 0. Used together with &lt;code&gt;UCSZ01&lt;/code&gt; and
&lt;code&gt;UCSZ00&lt;/code&gt; to set data frame size. Available sizes are 5-bit
(000), 6-bit (001), 7-bit (010), 8-bit (011) and 9-bit (111).
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
bit 1
&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;RXB80&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;
Receive Data Bit 8. When using 8 bit transmission the 8th bit received.
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
bit 0
&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;TXB80&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;
Transmit Data Bit 8. When using 8 bit transmission the 8th bit to be
submitted.
&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;table class=&#34;table table-hover table-bordered table-striped&#34;&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;
UCSR0C Bit #
&lt;/th&gt;
&lt;th&gt;
Name
&lt;/th&gt;
&lt;th&gt;
Description
&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;
bit 7
bit 6
&lt;/td&gt;
&lt;td&gt;
&lt;/td&gt;
&lt;td&gt;
USART Mode Select 1 and 0. &lt;code&gt;UMSEL01&lt;/code&gt; and &lt;code&gt;UMSEL00&lt;/code&gt;
combined select the operating mode. Available modes are asynchronous
(00), synchronous (01) and master SPI (11).
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
bit 5
bit 4
&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;UPM01&lt;/code&gt;
&lt;code&gt;UPM00&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;
USART Parity Mode 1 and 0. &lt;code&gt;UPM01&lt;/code&gt; and &lt;code&gt;UPM00&lt;/code&gt;
select the parity. Available modes are none (00), even (10) and odd
(11).
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
bit 3
&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;USBS0&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;
USART Stop Bit Select. Set to select 1 stop bit. Unset to select 2 stop
bits.
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
bit 2
bit 1
&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;UCSZ01&lt;/code&gt;
&lt;code&gt;UCSZ00&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;
USART Character Size 1 and 0. Used together with with
&lt;code&gt;UCSZ20&lt;/code&gt; to set data frame size. Available sizes are 5-bit
(000), 6-bit (001), 7-bit (010), 8-bit (011) and 9-bit (111).
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
bit 0
&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;UCPOL0&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;
USART Clock Polarity. Set to transmit on falling edge and sample on
rising edge. Unset to transmit on rising edge and sample on falling
edge.
&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h3 id=&#34;more-reading&#34;&gt;More Reading&lt;/h3&gt;
&lt;p&gt;&lt;a href=&#34;https://github.com/tuupola/avr_demo/tree/master/blog/simple_usart&#34;&gt;Full source code&lt;/a&gt;
of this article. &lt;a href=&#34;https://sites.google.com/site/qeewiki/books/avr-guide/usart&#34;&gt;USART entry in QEEWiki&lt;/a&gt; by
Q. &lt;a href=&#34;http://www.engineersgarage.com/embedded/avr-microcontroller-projects/serial-communication-atmega16-usart&#34;&gt;Serial Communication Using AVR Microcontroller USART&lt;/a&gt;
by Engineers Garage. &lt;a href=&#34;http://www.cs.mun.ca/~rod/Winter2007/4723/notes/serial/serial.html&#34;&gt;Serial Communication Notes&lt;/a&gt;
by Rod Byrne.&lt;/p&gt;
&lt;div class=&#34;alert alert-info&#34;&gt;
&lt;b&gt;Want to improve your understanding of electronics?&lt;/b&gt; Try the &lt;a data-category=&#34;Udemy&#34; data-action=&#34;Basic Electronics for Arduino Makers&#34; data-label=&#34;Bottom Alert&#34; href=&#34;https://click.linksynergy.com/deeplink?id=sTps5OcxYdc&amp;mid=39197&amp;murl=https%3A%2F%2Fwww.udemy.com%2Fbasic-electronics%2F&#34;&gt;Basic Electronics for Arduino Makers&lt;/a&gt; video course from Udemy.</description>
    </item>
    
    <item>
      <title>How Does Led Matrix Work?</title>
      <link>https://www.appelsiini.net/2011/how-does-led-matrix-work/</link>
      <pubDate>Fri, 04 Nov 2011 00:00:00 +0000</pubDate>
      
      <guid>https://www.appelsiini.net/2011/how-does-led-matrix-work/</guid>
      <description>&lt;p&gt;Led matrices are fun toys. Who would not love blinkenlights? Electronics
is hard. Electronics is much harder than programming. I had hard time
trying to understand how do the led matrices work. What is best way to
learn something? Build one yourself.&lt;/p&gt;
&lt;h3 id=&#34;structure-of-led-matrix&#34;&gt;Structure of Led Matrix&lt;/h3&gt;
&lt;p&gt;In a matrix format LEDs are arranged in rows and columns. You can also
think of them as y and x coordinates. Lets assume we have 4x4 matrix.
Rows would be marked from A to D and columns from 1 to 4. Now we can
address each LED by row and column. Top left led would be (A,1). Bottom
down led would be (D,4).&lt;/p&gt;
&lt;p&gt;Led matrices come in two flavors. Common-row anode (left) and common-row
cathode (right).&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://www.appelsiini.net/attachments/4x4-1.png&#34; alt=&#34;Led matrices&#34;&gt;&lt;/p&gt;
&lt;p&gt;Figure above shows the different configurations. The difference between
these two configurations is how you lit a led. With common-row anode
current sources (positive voltage) are attached to rows A..D and
currents sinks (negative voltage, ground) to columns 1..4. With
common-row cathode current sinks are attached to rows A..D and currents
sources to columns 1..4.&lt;/p&gt;
&lt;p&gt;For example. To light bottom down led (D,4) of common cathode matrix you
would feed positive voltage to column 4 and connect row D to ground. For
sake of clarity I will using common-row cathode in examples for the rest
of this article.&lt;/p&gt;
&lt;h3 id=&#34;building-a-led-matrix&#34;&gt;Building a LED Matrix&lt;/h3&gt;
&lt;p&gt;To build a 4x4 common-row cathode matrix you will need 16 LEDs, four
resistors, some headers and prototyping board. I started by gluing the
leds to prototyping board with epoxy glue. This way it is easier to have
LEDs beautifully aligned. When gluing the leds make sure long and short
legs are aligned the same way.&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://www.appelsiini.net/attachments/4x4-glue.jpg&#34; alt=&#34;Gluing led matrix&#34;&gt;&lt;/p&gt;
&lt;p&gt;When glue is dry it is time to bend and solder. First bend all cathodes
to left as close to prototyping board as possible. Solder all cathodes
in each row together. When cathodes are ready, bend all anodes. Anodes
must not touch cathodes. I used piece of plastic tubing to help bending
the anodes to form a bridge above cathodes.&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://www.appelsiini.net/attachments/4x4-bend.jpg&#34; alt=&#34;Bending legs&#34;&gt;&lt;/p&gt;
&lt;p&gt;Now solder together all anodes in each row. Solder the headers and
connect cathode rows directly to the header.&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://www.appelsiini.net/attachments/4x4-bottom.jpg&#34; alt=&#34;Bottom&#34;&gt;&lt;/p&gt;
&lt;p&gt;Anode rows are connected to header with current limiting resistors.
Value of the resistor depends on the LED used. Check the LED datasheet
for forward voltage and current. &lt;a href=&#34;http://led.linear1.org/1led.wiz&#34;&gt;LED
calculator&lt;/a&gt; will help you finding out
correct resistor. Matrix is now ready for testing.&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://www.appelsiini.net/attachments/4x4-top.jpg&#34; alt=&#34;Top&#34;&gt;&lt;/p&gt;
&lt;h3 id=&#34;addressing-single-led&#34;&gt;Addressing Single LED&lt;/h3&gt;
&lt;p&gt;Connecting ground to row A and positive voltage to column 1 will light
the top right LED (A,1).&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://www.appelsiini.net/attachments/4x4-test-1.jpg&#34; alt=&#34;Single led lit&#34;&gt;&lt;/p&gt;
&lt;p&gt;Connecting ground to row D and positive voltage to column 4 will light
the bottom down LED (D,4).&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://www.appelsiini.net/attachments/4x4-test-2.jpg&#34; alt=&#34;Single led lit&#34;&gt;&lt;/p&gt;
&lt;p&gt;Intuition would say lighting the both (A,1) and (D,4) at the same time
is just connecting all the four wires. This is not the case. There are
four LEDs which are lit. This is because current is also flowing through
(A,4) and (D,1).&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://www.appelsiini.net/attachments/4x4-test-3.jpg&#34; alt=&#34;Four leds lit&#34;&gt;&lt;/p&gt;
&lt;h3 id=&#34;multiplexing-and-persistence-of-vision&#34;&gt;Multiplexing and Persistence of Vision&lt;/h3&gt;
&lt;p&gt;Multiplexing can be used to display arbitrary patterns with led
matrices. Multiplexing is sometimes also called scanning. It scans rows
(usually from up to down) and lights needed leds only in one row at
time. Something like following:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Start by having everything disconnected.&lt;/li&gt;
&lt;li&gt;Connect positive voltage all the needed columns.&lt;/li&gt;
&lt;li&gt;Connect row to ground. This lights the needed leds in the row.&lt;/li&gt;
&lt;li&gt;Disconnect the row and all columns.&lt;/li&gt;
&lt;li&gt;Do the same steps one by one to all rows and then start from the
beginning.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Do this slowly and you would see blinking LED rows. Do it really fast
and human eye can see the whole pattern. Phenomenon is called
&lt;a href=&#34;http://en.wikipedia.org/wiki/Persistence_of_vision&#34;&gt;persistence of vision&lt;/a&gt;.&lt;/p&gt;
&lt;h3 id=&#34;draw-a-pattern&#34;&gt;Draw a Pattern&lt;/h3&gt;
&lt;p&gt;Lets write some simple code for drawing a pattern on the matrix. Note!
Even though I am using Arduino board I do not use Arduino libraries nor
IDE for developing. I do however like the Arduino pin numbering scheme.
Functions &lt;code&gt;pin_mode()&lt;/code&gt; and &lt;code&gt;digital_write()&lt;/code&gt;
work exactly the same way as their Arduino equivalents.&lt;/p&gt;
&lt;p&gt;We start by setting up the pins and default state for them.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-c&#34; data-lang=&#34;c&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;uint8_t&lt;/span&gt; column_pins[&lt;span style=&#34;color:#ae81ff&#34;&gt;4&lt;/span&gt;] &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; { &lt;span style=&#34;color:#ae81ff&#34;&gt;2&lt;/span&gt;, &lt;span style=&#34;color:#ae81ff&#34;&gt;3&lt;/span&gt;, &lt;span style=&#34;color:#ae81ff&#34;&gt;4&lt;/span&gt;, &lt;span style=&#34;color:#ae81ff&#34;&gt;5&lt;/span&gt; };
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;uint8_t&lt;/span&gt; row_pins[&lt;span style=&#34;color:#ae81ff&#34;&gt;4&lt;/span&gt;]    &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; { &lt;span style=&#34;color:#ae81ff&#34;&gt;11&lt;/span&gt;, &lt;span style=&#34;color:#ae81ff&#34;&gt;10&lt;/span&gt;, &lt;span style=&#34;color:#ae81ff&#34;&gt;9&lt;/span&gt;, &lt;span style=&#34;color:#ae81ff&#34;&gt;8&lt;/span&gt; };
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;static&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;void&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;init&lt;/span&gt;(&lt;span style=&#34;color:#66d9ef&#34;&gt;void&lt;/span&gt;) {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#75715e&#34;&gt;/* Turn all columns off by setting then low. */&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;for&lt;/span&gt; (&lt;span style=&#34;color:#66d9ef&#34;&gt;uint8_t&lt;/span&gt; x&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;0&lt;/span&gt;; x&lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;4&lt;/span&gt;; x&lt;span style=&#34;color:#f92672&#34;&gt;++&lt;/span&gt;) {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#a6e22e&#34;&gt;pin_mode&lt;/span&gt;(column_pins[x], OUTPUT);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#a6e22e&#34;&gt;digital_write&lt;/span&gt;(column_pins[x], LOW);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    }
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#75715e&#34;&gt;/* Turn all rows off by setting then high. */&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;for&lt;/span&gt; (&lt;span style=&#34;color:#66d9ef&#34;&gt;uint8_t&lt;/span&gt; y&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;0&lt;/span&gt;; y&lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;4&lt;/span&gt;; y&lt;span style=&#34;color:#f92672&#34;&gt;++&lt;/span&gt;) {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#a6e22e&#34;&gt;pin_mode&lt;/span&gt;(row_pins[y], OUTPUT);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#a6e22e&#34;&gt;digital_write&lt;/span&gt;(row_pins[y], HIGH);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    }
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;To display a pattern on matrix we use &lt;code&gt;draw()&lt;/code&gt; function.
Bitmap is passed as two dimensional array. Delay is used only to
demonstrate persistence of vision.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-c&#34; data-lang=&#34;c&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;uint8_t&lt;/span&gt; pattern[&lt;span style=&#34;color:#ae81ff&#34;&gt;4&lt;/span&gt;][&lt;span style=&#34;color:#ae81ff&#34;&gt;4&lt;/span&gt;]  &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; {{&lt;span style=&#34;color:#ae81ff&#34;&gt;1&lt;/span&gt;,&lt;span style=&#34;color:#ae81ff&#34;&gt;0&lt;/span&gt;,&lt;span style=&#34;color:#ae81ff&#34;&gt;0&lt;/span&gt;,&lt;span style=&#34;color:#ae81ff&#34;&gt;1&lt;/span&gt;}, {&lt;span style=&#34;color:#ae81ff&#34;&gt;0&lt;/span&gt;,&lt;span style=&#34;color:#ae81ff&#34;&gt;1&lt;/span&gt;,&lt;span style=&#34;color:#ae81ff&#34;&gt;0&lt;/span&gt;,&lt;span style=&#34;color:#ae81ff&#34;&gt;0&lt;/span&gt;}, {&lt;span style=&#34;color:#ae81ff&#34;&gt;0&lt;/span&gt;,&lt;span style=&#34;color:#ae81ff&#34;&gt;0&lt;/span&gt;,&lt;span style=&#34;color:#ae81ff&#34;&gt;1&lt;/span&gt;,&lt;span style=&#34;color:#ae81ff&#34;&gt;0&lt;/span&gt;}, {&lt;span style=&#34;color:#ae81ff&#34;&gt;1&lt;/span&gt;,&lt;span style=&#34;color:#ae81ff&#34;&gt;0&lt;/span&gt;,&lt;span style=&#34;color:#ae81ff&#34;&gt;0&lt;/span&gt;,&lt;span style=&#34;color:#ae81ff&#34;&gt;1&lt;/span&gt;}};
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;void&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;draw&lt;/span&gt;(&lt;span style=&#34;color:#66d9ef&#34;&gt;uint8_t&lt;/span&gt; buffer[&lt;span style=&#34;color:#ae81ff&#34;&gt;4&lt;/span&gt;][&lt;span style=&#34;color:#ae81ff&#34;&gt;4&lt;/span&gt;], &lt;span style=&#34;color:#66d9ef&#34;&gt;uint8_t&lt;/span&gt; delay) {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;for&lt;/span&gt; (&lt;span style=&#34;color:#66d9ef&#34;&gt;uint8_t&lt;/span&gt; row&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;0&lt;/span&gt;; row&lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;4&lt;/span&gt;; &lt;span style=&#34;color:#f92672&#34;&gt;++&lt;/span&gt;row) {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#75715e&#34;&gt;/* Connect or disconnect columns as needed. */&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#66d9ef&#34;&gt;for&lt;/span&gt; (&lt;span style=&#34;color:#66d9ef&#34;&gt;uint8_t&lt;/span&gt; column&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;0&lt;/span&gt;; column&lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;4&lt;/span&gt;; &lt;span style=&#34;color:#f92672&#34;&gt;++&lt;/span&gt;column) {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#a6e22e&#34;&gt;digital_write&lt;/span&gt;(column_pins[column], buffer[row][column]);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        }
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#75715e&#34;&gt;/* Turn on whole row. */&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#a6e22e&#34;&gt;digital_write&lt;/span&gt;(row_pins[row], LOW);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#a6e22e&#34;&gt;_delay_ms&lt;/span&gt;(delay);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#75715e&#34;&gt;/* Turn off whole row. */&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#a6e22e&#34;&gt;digital_write&lt;/span&gt;(row_pins[row], HIGH);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    }
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;To examine persistence of vision effect we draw the pattern with
different delays.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-c&#34; data-lang=&#34;c&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;uint8_t&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;main&lt;/span&gt;(&lt;span style=&#34;color:#66d9ef&#34;&gt;void&lt;/span&gt;) {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#a6e22e&#34;&gt;init&lt;/span&gt;();
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#75715e&#34;&gt;/* With 100ms delay eye can see updating row by row. */&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;for&lt;/span&gt; (&lt;span style=&#34;color:#66d9ef&#34;&gt;uint8_t&lt;/span&gt; i&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;0&lt;/span&gt;; i&lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;10&lt;/span&gt;; i&lt;span style=&#34;color:#f92672&#34;&gt;++&lt;/span&gt;) {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#a6e22e&#34;&gt;draw&lt;/span&gt;(pattern, &lt;span style=&#34;color:#ae81ff&#34;&gt;100&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    }
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#75715e&#34;&gt;/* With 10ms delay pattern appears but flickers. */&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;for&lt;/span&gt; (&lt;span style=&#34;color:#66d9ef&#34;&gt;uint16_t&lt;/span&gt; i&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;0&lt;/span&gt;; i&lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;100&lt;/span&gt;; i&lt;span style=&#34;color:#f92672&#34;&gt;++&lt;/span&gt;) {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#a6e22e&#34;&gt;draw&lt;/span&gt;(pattern, &lt;span style=&#34;color:#ae81ff&#34;&gt;10&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    }
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#75715e&#34;&gt;/* Withoud delay solid pattern appears. */&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;while&lt;/span&gt; (&lt;span style=&#34;color:#ae81ff&#34;&gt;1&lt;/span&gt;) {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#a6e22e&#34;&gt;draw&lt;/span&gt;(pattern, &lt;span style=&#34;color:#ae81ff&#34;&gt;1&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    }
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;return&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;0&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Full code can be found from
&lt;a href=&#34;https://github.com/tuupola/avr_demo/tree/master/4x4_matrix_part_1&#34;&gt;GitHub&lt;/a&gt;.
Check the output from video below.&lt;/p&gt;

&lt;div style=&#34;position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;&#34;&gt;
  &lt;iframe src=&#34;https://player.vimeo.com/video/31568410&#34; style=&#34;position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;&#34; title=&#34;vimeo video&#34; webkitallowfullscreen mozallowfullscreen allowfullscreen&gt;&lt;/iframe&gt;
&lt;/div&gt;

&lt;h3 id=&#34;more-reading&#34;&gt;More Reading&lt;/h3&gt;
&lt;p&gt;&lt;a href=&#34;http://blog.makezine.com/archive/2011/03/circuit-skills-led-matrix-sponsored-by-jameco-electronics.html&#34;&gt;Circuit Skills: LED Matrix&lt;/a&gt; by Make Magazine. &lt;a href=&#34;http://tinkerlog.com/2009/04/05/driving-an-led-with-or-without-a-resistor/&#34;&gt;Driving a LED with or Without a Resistor&lt;/a&gt; by Alexander Weber. &lt;a href=&#34;http://www.avagotech.com/docs/5980-3132EN&#34;&gt;Introduction to Driving LED Matrices (PDF)&lt;/a&gt; technote by Avago Technologies. &lt;a href=&#34;http://www.kpsec.freeuk.com/components/led.htm&#34;&gt;Light Emitting Diodes (LEDs)&lt;/a&gt; by the Electronics Club.&lt;/p&gt;</description>
    </item>
    
    <item>
      <title>iPhone Controlled HTML5 Logo and Color Cube</title>
      <link>https://www.appelsiini.net/2011/iphone-controlled-html5-logo-and-cube/</link>
      <pubDate>Wed, 02 Feb 2011 00:00:00 +0000</pubDate>
      
      <guid>https://www.appelsiini.net/2011/iphone-controlled-html5-logo-and-cube/</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;Heads up!&lt;/em&gt; This article was written in 2011 and it exists mostly for historical purposes.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;When Apple released iOS 4.2 end of last year I was on a boat trip to
Finland. For me the most interesting features were added to Safari
browser. I wanted to learn about WebSockets. New DeviceOrientation API
just begged to be abused. I had an idea to control the content of laptop
browser by tilting and rotating the phone. I had working but ugly code
before ship arrived to Helsinki.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;If you have short attention span go straight to the &lt;a href=&#34;https://www.appelsiini.net/demo/websocket/html5.html&#34;&gt;HTML5 logo&lt;/a&gt; demo.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;a href=&#34;https://github.com/tuupola/demo_code/tree/master/websocket&#34;&gt;Code&lt;/a&gt; has
been sitting on my hard drive since. I cleaned it up during last couple
of days. Also added additional eye candy by using the
oh-so-hot-at-the-moment HTML5 logo.&lt;/p&gt;
&lt;!--mode--&gt;
&lt;h3 id=&#34;how-does-it-look&#34;&gt;How Does It Look?&lt;/h3&gt;

&lt;div style=&#34;position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;&#34;&gt;
  &lt;iframe src=&#34;https://player.vimeo.com/video/19451023&#34; style=&#34;position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;&#34; title=&#34;vimeo video&#34; webkitallowfullscreen mozallowfullscreen allowfullscreen&gt;&lt;/iframe&gt;
&lt;/div&gt;

&lt;h3 id=&#34;how-does-it-work&#34;&gt;How Does It Work?&lt;/h3&gt;
&lt;p&gt;First open demo page with your browser. Browser must support WebSockets.
If you are using Safari which also support CSS 3D transforms check
&lt;a href=&#34;https://www.appelsiini.net/demo/websocket/html5.html&#34;&gt;HTML5 Logo&lt;/a&gt; page.
If you are using Chrome try &lt;a href=&#34;https://www.appelsiini.net/demo/websocket/cube.html&#34;&gt;Colour Cube&lt;/a&gt; page. When you
open a demo page it generates a random PIN number and connects to a
WebSocket server. PIN number is used as part of channel name.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-javascript&#34; data-lang=&#34;javascript&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;var&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;socket&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;new&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;WebSocket&lt;/span&gt;(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;ws://ws.appelsiini.net:8080/iphone/&amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;+&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;pin&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Next open the &lt;a href=&#34;https://www.appelsiini.net/demo/websocket/iphone.html&#34;&gt;mobile page&lt;/a&gt; with you
iPhone or iPod. Enter PIN number from previous page and press connect.
Your mobile browser now connects to same WebSocket server.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-javascript&#34; data-lang=&#34;javascript&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;var&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;socket&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;new&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;WebSocket&lt;/span&gt;(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;ws://ws.appelsiini.net:8080/iphone/&amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;+&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;pin&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;If the PIN numbers match your browsers are effectively paired. Mobile
browser then uses &lt;a href=&#34;http://goo.gl/lEYyx&#34;&gt;DeviceOrientation API&lt;/a&gt; do
determine iPhone orientation. When user tilts or turn the device new
orientation is sent via WebSocket to server. Server in turn sends the
same data to computer browser which is listening on same channel.&lt;/p&gt;
&lt;p&gt;Every time &lt;a href=&#34;https://www.appelsiini.net/demo/websocket/html5.html&#34;&gt;HTML5 Logo&lt;/a&gt; page receives WebSocket message it animates the logo using CSS 3D transforms.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-javascript&#34; data-lang=&#34;javascript&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;socket&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;onmessage&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;function&lt;/span&gt;(&lt;span style=&#34;color:#a6e22e&#34;&gt;event&lt;/span&gt;) {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;var&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;payload&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;JSON&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;parse&lt;/span&gt;(&lt;span style=&#34;color:#a6e22e&#34;&gt;event&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;data&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#a6e22e&#34;&gt;$&lt;/span&gt;(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;#elevator&amp;#34;&lt;/span&gt;).&lt;span style=&#34;color:#a6e22e&#34;&gt;css&lt;/span&gt;(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;-webkit-transform&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;rotateX(&amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;+&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;payload&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;data&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;x&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;-&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;1&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;+&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;deg)&amp;#34;&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#a6e22e&#34;&gt;$&lt;/span&gt;(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;#aileron&amp;#34;&lt;/span&gt;).&lt;span style=&#34;color:#a6e22e&#34;&gt;css&lt;/span&gt;(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;-webkit-transform&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;rotateZ(&amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;+&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;payload&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;data&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;y&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;1&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;+&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;deg)&amp;#34;&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#a6e22e&#34;&gt;$&lt;/span&gt;(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;#pitch&amp;#34;&lt;/span&gt;).&lt;span style=&#34;color:#a6e22e&#34;&gt;css&lt;/span&gt;(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;-webkit-transform&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;rotateY(&amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;+&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;payload&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;data&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;z&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;1&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;+&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;deg)&amp;#34;&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;a href=&#34;https://www.appelsiini.net/demo/websocket/cube.html&#34;&gt;Colour Cube&lt;/a&gt; is
almost the same. Only difference is It uses
&lt;a href=&#34;http://deanm.github.com/pre3d/&#34;&gt;Pre3d&lt;/a&gt; JavaScript 3d rendering engine
to draw and animate the cube.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Note! Spinning HTML5 logo is taken from &lt;a href=&#34;http://code.bocoup.com/html5logo-3d/&#34;&gt;HTML5 demo&lt;/a&gt; by &lt;a href=&#34;http://boazsender.com/&#34;&gt;Boaz Sender&lt;/a&gt;. Color cube is taken
from &lt;a href=&#34;http://deanm.github.com/pre3d/&#34;&gt;Pre3d demo gallery&lt;/a&gt; by
&lt;a href=&#34;http://www.deanmcnamee.com/&#34;&gt;Dean McNamee&lt;/a&gt;. I did not originally create
them. I just adapted them to connect and animate with iPhones.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3 id=&#34;websocket-server&#34;&gt;WebSocket Server&lt;/h3&gt;
&lt;p&gt;&lt;a href=&#34;https://github.com/tuupola/em-websocket-server&#34;&gt;WebSocket server&lt;/a&gt;
itself is simple Ruby script based on &lt;a href=&#34;http://rubyeventmachine.com/&#34;&gt;Event
Machine&lt;/a&gt; and
&lt;a href=&#34;https://github.com/igrigorik/em-websocket&#34;&gt;em-websocket&lt;/a&gt;. I could have
used &lt;a href=&#34;http://www.pusherapp.com/&#34;&gt;Pusher&lt;/a&gt; which provides a hosted
service. However I wanted to use this as learning experience. Also if
this demo goes popular I might hit some message limits of Pusher.&lt;/p&gt;
</description>
    </item>
    
  </channel>
</rss>