Digit Counter with 7-segment LED + Arduino

It just counts 0 to 9 with 7-segment LED. Only digit 1 side has been used since the digit 2 is burned out…
Adjust output pins for your environment. For simplicity, you need 7 pins for output in this example.
I am sure I can reduce the number of pins with demux. That’s gonna be the next project.

Parts: Arduino Duemilanove, Breadboard, a register and LTD-5523AB (Datasheet)

The LED-facing-upright LTD-5523AB pin-order is:

18, 17, 16, 15, 14, 13, 12, 11, 10pin 
[------------LTD-5523AB------------]
     | - A - |       | - A - |
     F       B       F       B
     | - G - |       | - G - |
     E       C       E       C
     | - D - |       | - D - |
[------------LTD-5523AB------------]
01, 02, 03, 04, 05, 06, 07, 08, 09pin

[7-segment LED for digit 1]
A = 16pin, B = 15pin, C = 03pin, D = 02pin, E = 01pin, F = 18pin, DP = 04pin
14pin is common cathode for digit 1 (it means it should be GNDed all the time.)

For example, to make the digit 3, just turn on A, B, C, D and G.

[7segment.pde]
//Output Pins
//* Adjust this for your pin outputs.
int ledPin[8] = {4, 5, 6, 7, 9, 10, 11, 12};  

//Segment to Pin
//* Adjust this for your 7 segment LED spec.
//                 A,  B, C, D, E,  F,  G, DP
int Seg2Pin[8] = {11, 10, 5, 6, 7, 9, 12, 4};

//Digit to Segment
// * You don't need modify this unless you want to change digits.
int Dec2Seg[11] =
{
//A(125), B(64), C(32), D(16), E(8), F(4), G(2), DP(1)
  0x07E, //Digit 0
  0x00C, //Digit 1
  0x0B6, //Digit 2
  0x09E, //Digit 3
  0x0CC, //Digit 4
  0x0DA, //Digit 5
  0x0FB, //Digit 6
  0x00E, //Digit 7
  0x0FF, //Digit 8
  0x0DF, //Digit 9
  0x100 //DP
};

void setup()                    // run once, when the sketch starts
{
  for (int i = 0; i < 8; i++)
    pinMode(ledPin[i], OUTPUT);      // sets the digital pin as output
}

void clearAllSegments()
{
  //Turm off all segments
  for (int i = 0; i < 8; i++)  // waits for a second
  {
    digitalWrite(ledPin[i], LOW);
  }
}

void drawDigit(int digit)
{
  int seg = Dec2Seg[digit];
  int pin = 0;

  while (seg > 0)
  {
    seg /= 2;
    if (seg & 0x1)
      digitalWrite(Seg2Pin[pin], HIGH);   // sets the LED on
    pin++;
  }
}

void loop()                     // run over and over again
{
  //Count 0 to 9
  for( int digit = 0; digit <= 10; digit++)
  {
    drawDigit(digit);
    delay(1000);                  // waits for a second
    clearAllSegments();
  }
}

Update 1: I change the 13pin to 9pin for output since 13pin has some builtin register.
Update 2: I implemented a bit mask to select segments.

Scanner + Printer = Copy Machine

Multi-functional printer is just a combination of printer and scanner.
So, why don’t you make DIY copy machine in Linux if you have a printer and scanner?
Make sure your scanner is supported in SANE in Linux, and install scanbuttond for scanner’s button control.
scanbuttond seems no longer in active development, but it works OK in CentOS.

I added these commands in /usr/local/etc/buttonpressed.sh as follows:

In the button pressed event,

scanimage --mode lineard --resolution 300 -x 215 -y 297 > test.pnm
pnmtops -scale 1000 -dpi 300 test.pnm | lpr -PHL-2040
convert test.pnm /some/archive/`date + %Y%m%d%H%M`.pdf

So, whenever I press the button, it automatically starts scanning, then prints it out and archives as PDF.
The only thing that bugs me is the slow scanning time…

How to move SVN repository to other server.

On old SVN Server side:

# svnadmin dump your_repository_dir > repo.dmp

* This will take more than minutes.

On new SVN Server side:

# svnadmin create repo
# svnadmin load repo < repo.dmp

Note that taking a dump of repository does NOT dump the configuration files in repository.
So make you copy the conf directory.

References:

http://www.digitalmediaminute.com/article/2251/how-to-move-a-subversion-repository
http://2tbsp.com/node/88
http://svnbook.red-bean.com/en/1.1/ch05s03.html#svn-ch-5-sect-3.5

Posted in Linux. Tags: , , . Leave a Comment »

How to move /home to other drive.

Be careful to check if your /home is mounted or just a directory.
Thanks to IBM, following this instruction suffice for everybody.
http://www.ibm.com/developerworks/linux/library/l-partplan.html

I finally made the /home in software RAID 1… Next thing I need a UPS for the machine.

Posted in Linux. Tags: , , . Leave a Comment »

Xen Paravirtualized CentOS domU on CentOS 5.3 dom0

How to install paravirtualized CentOS 5.3 x64 as domU

# virt-install --paravirt \
               --name centosx64 \
               --ram 512 \
               --file /home/xen/images/centosx64.img \
               --file-size 10 \
               --nographics \
               --location http://mirrors.kernel.org/centos/5.3/os/x86_64/

It means Memory: 512MB, Disk Image: 10GB and No Graphics
Check the comment if you want to make use of pre-downloaded iso image or dvd.

If you want to add Desktop environment after instrallation, just add these.

# yum groupinstall "X Window System"
# yum groupinstall "GNOME Desktop Environment"

Reference: http://www.cyberciti.biz/tips/rhel-centos-xen-virtualization-installation-howto.html

CentOS 5.3 + xen-3.4-testing

$ su -
$ cd /usr/src
$ hg clone http://xenbits.xensource.com/xen-3.4-testing.hg
$ cd xen-3.4-testing.hg
$ make world
$ make install
$ ./install.sh

* eth0 is not detected with this kernel at this point.
So, I have to build the kernel…

Reference: http://bderzhavets.wordpress.com/2009/04/17/setup-xen-34-centos-53-dom0-64-bit/

CentOS 5.3 + linux-2.6.27 kernel

Anyway, I wasn’t happy with the XEN 3.3 with the xen kernel 2.6.18-128.1.10.el5xen (got these by yum)
Let’s update the newer kernel and Xen.

So, download the xen kernel 2.6.27, then apply patches, and compile. Let’s see if it works with Xen 3.4…

$ git clone http://xenbits.xen.org/git-http/xenclient/linux-2.6.27.git
$ cd linux-2.6.27
$ git clone http://xenbits.xen.org/git-http/xenclient/linux-2.6.27-pq.git .git/patches
$ guilt-push -a

(These commands above are taken from Xen-devel ML.)
I have been looking for the best Linux distro + Xen, but I hope CentOS 5.3 will be the one.

$ make CONFIG_DEBUG_SECTION_MISMATCH=y

Error 1:
drivers/built-in.o: In function `acpi_ec_read’:
/usr/src/linux-2.6.27/drivers/acpi/ec.c:390: undefined reference to `in_query_wmi_event_data’

make: *** [.tmp_vmlinux1] Error 1

Patch 1: It’s fun to see this kind of comment “HACK ALERT!!” But just comment out this hack…

diff –git a/drivers/acpi/ec.c b/drivers/acpi/ec.c
index 2359480..b2c0221 100644
— a/drivers/acpi/ec.c
+++ b/drivers/acpi/ec.c
@@ -387,6 +387,7 @@ static int acpi_ec_read(struct acpi_ec *ec, u8 address, u8 * data)
/* HACK ALERT
* Please refer to wmi.c for an explanation on why we added this hack.
*/
+/*
if ( in_query_wmi_event_data == TRUE ) {
if ( address == 0×2b ) {
wmi_event_data_index = 0;
@@ -398,6 +399,7 @@ static int acpi_ec_read(struct acpi_ec *ec, u8 address, u8 * data)
wmi_event_data_index++;
}
}
+*/

return result;
}

$ make
$ make install
$ make modules_install
$ DEPMOD 2.6.27.19-5.1
$ mkinitrd /boot/initrd-2.6.27.19-5.1.img 2.6.27.19-5.1

Then, edit /boot/grub/menu.lst accordingly.

Installing Fedora 10 on a MacBook Pro

Ubuntu was a really bad choice for XEN HVM dom0/domUs…
Fedora 10 doesn’t support xen kernel as well.
Back to Fedora 8…

http://www.linuxquestions.org/questions/fedora-35/xen-in-fedora-10-691804/

Install Xen Kernel on Ubuntu 9.04 Jaunty i386

I stole the kernel from debian’s pool.

wget http://ftp.debian.org/debian/pool/main/l/linux-2.6/linux-modules-2.6.26-2-xen-686_2.6.26-15_i386.deb
wget http://ftp.debian.org/debian/pool/main/l/linux-2.6/linux-image-2.6.26-2-xen-686_2.6.26-15_i386.deb
sudo dpkg -i linux-modules-2.6.26-2-xen-686_2.6.26-15_i386.deb
sudo dpkg -i linux-image-2.6.26-2-xen-686_2.6.26-15_i386.deb

* It’s a good idea to look for newer version. I don’t know why we cannot search by the debian website. But you can use the FTP…

Compiling XEN Kernel 2.6.29.2 on Ubuntu 9.04 32bit

I am compiling XEN Kernel 2.6.29.2 on Ubuntu 9.04 32bit
GCC is 4.3.3 and some issues with new compiler’s optimization.

This is on-going memo… I have compiled the kernel but it seems not compatible with Ubuntu 9.04.
So, I switched the xen kernel version supported by debian team.

References:

(1) http://www.infohit.net/blog/post/running-xen-on-ubuntu-intrepid-and-jaunty.html
(2) http://linux.derkeiler.com/Mailing-Lists/Kernel/2008-05/msg01854.html
(3) http://www.comptechdoc.org/os/linux/usersguide/linux_ugkernel.html
(4) http://bderzhavets.wordpress.com/2009/01/03/setup-xen-330-ubuntu-intrepid-server-dom0-via-build-xen-kernel-based-on-httpxenbitsxensourcecomextlinux-2627-xenhg/

Errors:

(1) undefined reference to `__udivdi3′
arch/x86/kernel/built-in.o: In function `timer_interrupt’:
/usr/src/linux-2.6.29.2-xen/arch/x86/kernel/time_32-xen.c:465: undefined reference to `__udivdi3′
make: *** [.tmp_vmlinux1] Error 1
root@ubunzzo:/usr/src/linux-2.6.29.2-xen# vi /usr/src/linux-2.6.29.2-xen/arch/x86/kernel/time_32-xen.c

My attempt after reading reference (2) was successful, I inserted the asm(”":”+r”(delta)) to the timer_interrupt function at the while scope at line number around 500.

        /* System-wide jiffy work. */
        if (delta >= NS_PER_TICK) {
                do_div(delta, NS_PER_TICK);
                processed_system_time += delta * NS_PER_TICK;
                while (delta > HZ) {

                        asm("":"+r"(delta));

                        do_timer(HZ);
                        delta -= HZ;
                }
                do_timer(delta);
        }

* This works because this asm fools gcc compiler not to use optimization.
I guess do_timer internally uses do_div macro?

I found the same kind of fix in linux kernel here

The AT&T assembly format still looks confusing…