admin

admin

Sunday, 17 May 2015 10:53

BASH Dropbox Uploader on OpenWRT

BASH Dropbox uploader on OpenWRT

This guide is to provide detailed information on how install BASH Dropbox Uploader to a wireless router flashed with OpenWRT. Dropbox Uploader is a BASH script written by Andred Fabriz that allows you to upload, download, delete files (and more) from Dropbox.

Monday, 04 May 2015 20:00

Recover bricked TL-MR3020

If your TL-MR3020 router is bricked with the following symptoms, most likely you can use this method to recover it.

  1. Ping the router without problem
  2. Telnet connection failed
  3. SSH connection failed

 

Solution:

  1. Put the router switch to AP mode
  2. Turn on the router power
  3. Push and hold the "WPS" button
  4. When the WPS Led flash slowly, switch on AP mode to 3G mode. The LED should flash quicky.

Now, you can Telnet to router

 

Erase the root data

Login to the router via telnet and enter the following command. Most likely your router is now recovered. 

mtd -r erase rootfs_data

Continue following procedures if it is still not working.

 

Copy firmware to router

  • Login to router via telnet and change the password in order to enable SSH
passwd
  • Copy the OpenWRT firmware to the router /tmp folder. I personally like and use WinSCP.

 

Upload the firmware to router

SSH to router and write the firmware to router. Where code.bin is your OpenWRT firmware file. 

mtd -r write code.bin firmware

Reboot the router and your router should be working now. If all the above methods is not working for you, then you should go for Serial Console method to recover the bricked router.

How to increase storage on TP Link TL MR3020 with

The TP-Link TL-MR3020 N150 3G/4G Travel Router is a very small device with a size of 74mm x 67mm x 22mm, it has only 4MB flash and 32MB memory. The router have about 428KB (67%) space available after installing OpenWRT Barrier Breaker 14.07, you may encounter shortage of storage when installing certain extensions due to limited of router space. 

By employing OpenWrt's extroot, you can expand the storage capacity of your root file system using the additional space of an added storage device.

Thursday, 05 March 2015 23:29

Arduino based Electronic Queuing System

Queue calling system

This is a Queuing System project requested by a clinic asistant which allows the doctor enter number from a keyboard and display it on a 32x16 LED panel.

This project uses two Arduino, the first Arduino functioned as a SENDER which included a PS2 keyboard and a mini LCD for number input. While the other Arduino is functioned as a RECEIVER which will trigger a "ding-dong" tone and display number on the 32x16 LED panel.

The SENDER uses a PS2 keyboard instead of USB keyboard, USB keyboard will cost higher since it require a USB host shield. You should get a Matrix keypad (please use google translate) in case the PS2 keyboard is not available in the market.

These two Arduino (SENDER & RECEIVER) is connected via a CAT5e network cable, the CAT5e cable provide power to the RECEIVER and also transfer data between two Arduino.

This project provides step by step approach to driving a Dot Matrix Display (DMD) Panel with an Arduino. The DMD is a 512 pixels single colour LED display arranged in 32x16 layout, a 16 pin (2x8) IDC connector is used to interface with Arduino.

In order to drive the 32x16 Dot Matrix Display Panel from Arduino, the DMD library for Arduino is required. You can download it from Freetronics GitHub.

The Freetronics DMD library is able to write letter and text on the display board with limited function, variable string and text centering is not supported. Yeah! now you can use my code to write variable string on the display board and centering it horizontally.

Updated: DMD2 library is released, this library is currently in BETA release.

Sunday, 08 February 2015 21:09

Arduino电子排队叫号机

这是为谋诊所设计的排队叫号机,计数器只需显示两位数。此叫号机使用了两片Arduino,一个安置在房内用来输入编号,称之为发送器,另一个则安装在房外,用来显示编号,称之为接收器。发送器是通过串口发送信息给接收器。

发送器连接了一个PS2键盘来完成输入,当然也可以使用USB键盘,不过必须添加一个USB Host Shield,这样将会增加成本。如果没办法取得PS2键盘,建议使用矩阵键盘。发送器也应用了一个小型LCD,用于显示编号,当然还能显示更多的相关资料。

接收器用了一片32x16像素的矩阵LED单元板,用来显示从串口取得的相关数据。接收器也安装了一个“铃铛”报知器,每当接收到来自发送器的数据,都会温馨提醒一下。

Sunday, 12 October 2014 15:12

Using HEF4094 Shift Registers with Arduino

I have many seven segment modules in my hand. Each module consists of 5 digits and each digit is controlling by individual HEF4094 shift register. As shown in figure above is the seven segment module.

HEF4094 is an 8-stage serial shift register. Data is shifted on the LOW-to-HIGH transitions of the CP (Clock) input. The product data sheet is available here.

HEF4094 operates over a recommended VDD power supply range of 3 V to 15 V referenced to VSS (usually ground). There is also 74HC4094 available which operates at 2V to 6V.

I own a TP-Link TL-WR1043 V2.1 wireless router, I would like to test if it is able to run on OpenWRT or DD-WRT. it is first tested on OpenWRT, DD-WRT later, so far it has been working flawlessly for me.

 

About TP-Link TL-WR1043 V2.1 Wireless Router
TP-Link TL-WR1043 V2.1 is a 300Mbps Wireless N Gigabit Router, it has more memory (64MB) compared with the TL-WR1043 V1.x. Here is the comparison:

HW Version

CPU

Ram

Flash

Network

Gigabit

USB

Serial

JTag

1.x

Atheros  [email protected]

32MB

8MB

4x1

Yes

Yes

Yes

Yes

2.x

Atheros[email protected] 64MB

64MB

8MB

4x1

Yes

Yes

Yes

No

此教程使用一个TP-Link TL-MR3020 3G/4G无线路由器来打造简单的无线广告机。目标是提供一个免费热点(hostpot)让公众无线上纲同时弹出hostpot提供者的广告(称之为Splash page 或者Landing page)。

TP-Link TL-MR3020的厂家固件(Firmware)功能有限,不能安装第三方软件包,因此,固件必须升级至OpenWRT,然后再安装NoDogSplash

虽然这里是使用TP-Link TL-MR3020为教题,一般支持OpenWRT的路由器也是适合的。 

This is a guide on how to setting up a simple wireless hotspot using a TP-Link TL-MR3020 3G/4G Wireless N Router installaing with NoDogSplash. The goal is to provide a free hotspot with a splash page to advertise who is providing the hotspot, it should work as well for other OpenWRT supported router.
Friday, 04 July 2014 13:54

Arduino based RGB Matrix LED tester

Arduino based RGB Matrix LED tester

This is a very simple Arduino project which control the 16x32 RGB LED Matrix Panel via an 16pin IDC cable. The Arduino will continuously sending 5 set colours (Red, Green, Blue, White, Black)  to the LED Matrix Panel that allow the technician to find out which part of the LED Matrix Panel is malfunction.

Wednesday, 18 June 2014 23:34

Removing Applications from Raspberry Pi

You might want to remove some applications to free up some space on SD card. Use the following syntax to uninstall a program
sudo apt-get –purge remove APPNAME #replace APPNAME with the name of the app you want to remove
An example to remove Scratch program 
sudo apt-get remove scratch
Tuesday, 10 June 2014 14:52

Raspberry Pi Digital Signage

Raspberry Pi (Model B) is a single-board computer that uses an ARM 11 (ARM1176JZF-S core) processor running at 700MHz (it can overclock up to 1GHz) with 512MB RAM.
 
This article shows you how to turn your Raspberry Pi into a cheap, browser based digital signage solution. It covers setting up a mini webserver on using the lighttpd+PHP web server and also how to start a web browser without a desktop environment.
 
I will use Midori as the web browser since it is a default browser that is found in Raspbian (a free operating system based on Debian optimized for the Raspberry Pi).
Edit the crontab file
sudo su - #switch to supuer user
crontab -e #edit crontab file

Put this line at the end of the file. This will turn off display at 5.30PM and turn on display at 8.30AM

30 17 * * * tvservice -o

30 8 * * * tvservice -p; fbset -depth 8; fbset -depth 16

 
Crontab syntax:
*     *     *   *    *        command to be executed
-     -     -   -    -
|     |     |   |    |
|     |     |   |    +----- day of week (0-6) (Sunday=0)
|     |     |   +------- month (1-12)
|     |     +--------- day of month (1-31)
|     +----------- hour (0-23)
+------------- minute (0-59)
Wednesday, 21 May 2014 12:46

Raspberry Pi Schedule Reboot

Edit the crontab file
sudo su - #switch to supuer user
crontab -e #edit crontab file

Put this line at the end of the file. This will reboot the Raspberry Pi at 1.30PM every day.
30 13 * * * sudo reboot
 
Crontab syntax:
*     *     *   *    *        command to be executed
-     -     -   -    -
|     |     |   |    |
|     |     |   |    +----- day of week (0-6) (Sunday=0)
|     |     |   +------- month (1-12)
|     |     +--------- day of month (1-31)
|     +----------- hour (0-23)
+------------- minute (0-59)
Example Configuration
  • Raspberry IP: 192.168.0.123
  • Router IP (Gateway): 192.168.0.254
  • Subnet Mask: 255.255.255.0
  
List the network interface we currently have available:
cat /etc/network/interfaces
The output should look like this:
auto lo
iface lo inet loopback
iface eth0 inet dhcp
allow-hotplug wlan0
iface wlan0 inet manual
wpa-roam /etc/wpa_supplicant/wpa_supplicant.conf
iface default inet dhcp
The line iface eth0 inet dhcp shows that it is currently getting out IP address via DHCP. We need to change this line to iface eth0 inet static.

Edit /etc/network/interfaces
sudo nano /etc/network/interfaces
Change  iface eth0 inet dhcp to iface eth0 inet static and add the following settings just below it:
address 192.168.0.123
netmask 255.255.255.0
network 192.168.0.0
broadcast 192.168.0.255
gateway 192.168.0.254
Here is an example:

auto lo

iface lo inet loopback
iface eth0 inet static
address 192.168.0.123
netmask 255.255.255.0
network 192.168.0.0
broadcast 192.168.0.255
gateway 192.168.0.254

allow-hotplug wlan0
iface wlan0 inet manual
wpa-roam /etc/wpa_supplicant/wpa_supplicant.conf
iface default inet dhcp

Finally, reboot the Raspberry Pi.
 
 
Fixing DNS problems
DNS is the service that converts the website URL, i.e. www.goggle.com into the IP address (173.194.126.36) that is needed for actual communication. 
 
Check your DNS entrie
cat /etc/resolv.conf
 
Here is an example of the output
nameserver 192.168.0.254
The nameserver should same as your gateway (your modem IP). If the nameserver and the gateway is different, you should modify the /etc/resolv.conf file and change the nameserver to your gateway IP.
sudo nano  /etc/resolv.conf
 
 
View the current display configuration
tvservice -s
 
View the /boot/config.txt settings
vcgencmd get_config int
 
Get the list of what is supported by your monitor:
tvservice -d dataFile #dump information to dataFile
edidparser dataFile #load dataFile & display on screen

Midori is a lightweight browser using the WebKit rendering engine and it is a default browser that is found in Raspbian. This is a quick quide to start the Midori browser from the command line without a desktop manager.

 
To start the Midori in full screen mode, use the following command:
xinit /usr/bin/midori -e Fullscreen -a http://domain/homepage.html
 
However it is not in full screen mode, it just fill up about quarter size of the screen. To fix this problem, Midori must run on a windows manager. Here is the solution:
Sunday, 04 May 2014 20:43

Setup a Raspberry Pi PHP web server

Lighttpd is a lightweight web server, with all the essential functions of a web server, PHP is a server-side scripting language designed for web development but also used as a general-purpose programming language. This is a quide on how to install Lighttpd and PHP on a Raspberry Pi.
 
Prerequisite
Sunday, 04 May 2014 11:02

Some useful javascript

Some useful javascript
Create an XML HTTP Request (XHR) object
  1. function create_XMLHttpRequest() { //create new XHR object
  2. if (window.XMLHttpRequest)
  3. {// code for IE7+, Firefox, Chrome, Opera, Safari
  4. xmlhttp=new XMLHttpRequest();
  5. } else {// code for IE6, IE5
  6. xmlhttp=new ActiveXObject("Microsoft.XMLHTTP");
  7. }
  8. return xmlhttp;
  9. }
 
 
Send request to Server and receive response from server
  • Get replay from php web server: serverResponseInfo=httpGetRequest("http://domain/myReply.php")
  • Read content from a text file: serverResponseInfo=httpGetRequest("myTextFile.txt")
  • Read content from a text file: document.getElementById("myDiv").innerHTML=loadXMLDoc("myTextFile.txt");
function httpGetRequest(url)
{
   xmlhttp= create_XMLHttpRequest();
   xmlhttp.open("GET",url,false);
   xmlhttp.send();
   return xmlhttp.responseText;
}
 
 
Check if file exist
  • To check a file if exist in www root directory: fileExists("/settings.xml")
  • To check a file if exist in the current directory: fileExists("settings.xml")
  1. function fileExists(filename) {
  2. xmlhttp= create_XMLHttpRequest(); //create new XHR object
  3. if(!xmlhttp) return false;
  4. try
  5. {
  6. xmlhttp.open("HEAD", filename, false);
  7. xmlhttp.send(null);
  8. return (xmlhttp.status==200) ? true : false;
  9. }
  10. catch(er)
  11. {
  12. return false;
  13. }
  14. }
 
 
Load an XML file using XML HTTP Request
Eg. loadXML("settings.xml")
  1. function loadXML(XML_filename) {
  2. xmlhttp= create_XMLHttpRequest();
  3. xmlhttp.open("GET",XML_filename ,false);
  4. xmlhttp.send();
  5. return xmlhttp.responseXML;
  6. }
 
 
Convert XML to string
  1. function xmlToString(xmlDoc){
  2. if(xmlDoc.xml){
  3. // MSIE
  4. xmlString = xmlDoc.xml;
  5. }else{
  6. xmlString = (new XMLSerializer).serializeToString(xmlDoc);
  7. }
  8. return xmlString;
  9. }
 
 
Create a string based on date
Example of output: 2014_0502
  1. function createString_accordingDate() {
  2. var today = new Date();
  3. var dd = today.getDate();
  4. var mm = today.getMonth()+1;//January is 0!
  5. var yyyy = today.getFullYear();
  6. if(dd<10){dd='0'+dd} ;
  7. if(mm<10){mm='0'+mm};
  8. return (yyyy + "_" + mm + dd);
  9. }
.
Saturday, 15 February 2014 20:38

Wireless Router Remote Control Car

This is my first RC car control by an Arduino and a wirless router running OpenWRT. There are many OpenWRT supported routers, I'm using a TP-Link TL-MR3020 3G/4G Wireless N Router for this project since it is very slim, low power consumption and it is cheap.

 

RC car features

  • A webcam, the car can be driven without line of sight
  • A horn so that you can honk at people.
  • LED Headlights attached to the front of the car
  • Two wheel drive motor
  • Windows GUI application or web interface
  • Future Additions: Control by a smartphone (Android & IOS)
 
TPicShow is an image slider VCL that enables you to create amazing splash screens and 176 transitional effects in pure Delphi code.
 
Features:
  1. Image transition can be controlled programmatically
  2. Image can be stretched or centered in the client area of the control
  3. Control can show a background image as centered, stretched, or tiled
  4. Transition process can use a separate thread
  5. New transitional effects can be easily implemented and added.
 
TPicShow's last update is on July 19, 2010 which does not support RAD Studio XE. By creating a package file, you can installing and running TPicShow on RAD Studio XE5 without any problem.
 
Count number of digits in a number(integer). Eg. countDigits(5678) return 4
  1. byte countDigits(int num){
  2. byte count=0;
  3. while(num){
  4. num=num/10;
  5. count++;
  6. }
  7. return count;
  8. }
 
 
Extract a digit from an number(integer). Eg. getDigit(5678,2) return 6
  1. int getDigit(unsigned int number, int digit) {
  2. for (int i=0; i<digit-1; i++) {
  3. number /= 10;
  4. }
  5. return number % 10;
  6. }
 
 
Extract all digits from a number and store them to an array
  1. #define MAX_NUMBER_OF_DIGITS 5
  2. byte array_to_hold_digit[MAX_NUMBER_OF_DIGITS];
  3.  
  4. void setup(void) {
  5. Serial.begin(9600);
  6. extractDigit_Save2Arrary(5678);
  7. Serial.println(array_to_hold_digit[0]);
  8. Serial.println(array_to_hold_digit[1]);
  9. Serial.println(array_to_hold_digit[2]);
  10. Serial.println(array_to_hold_digit[3]);
  11. }
  12.  
  13. void loop(void) {
  14.  
  15. }
  16.  
  17. /*----------------------------------------------------------------------------
  18.  count number of digits in a number(integer)
  19. ----------------------------------------------------------------------------*/
  20. void extractDigit_Save2Arrary(int number){
  21. byte number_of_digit = countDigits(number);
  22. for (byte i=0; i<number_of_digit; i++) {
  23. array_to_hold_digit[i] = getDigit(number,number_of_digit-i); //store each digit to array
  24. }
  25.  
  26. /*
  27.   for (byte i=0; i<number_of_digit; i++) {
  28.   Serial.print(array_to_hold_digit[i]);
  29.   }
  30.   Serial.println();
  31.   */
  32. }
  33.  
  34. /*----------------------------------------------------------------------------
  35.  count number of digits in a number(integer)
  36. ----------------------------------------------------------------------------*/
  37. byte countDigits(int number){
  38. byte count=0;
  39. while(number){
  40. number=number/10;
  41. count++;
  42. }
  43. return count;
  44. }
  45.  
  46. /*----------------------------------------------------------------------------
  47.  extract a digit from an number(integer)
  48. ----------------------------------------------------------------------------*/
  49. byte getDigit(unsigned int number, int digit) {
  50. for (int i=0; i<digit-1; i++) {
  51. number /= 10;
  52. }
  53. return number % 10;
  54. }
 
 
Saturday, 21 December 2013 22:21

Debouncing Multiple Switches

If you want to input a manual switch signal into a digital circuit you'll need to debounce the signal so a single press doesn't appear like multiple presses. 
 
There is a Bounce library for Arduino which is very easy to use. However there is limitations with this Bounce library.
  • You are unlikely to enable the internal pull-up resistor on switch pins, therefore each switch require an external pull-up resistor
  • It is not possible to detect the switch state before main loop (setup). When you press a switch during power on, you will never get the state of the switch.
Tuesday, 17 December 2013 21:51

Arduino function with optional argument(s)

Function Declaration and Function Prototypes: function prototype allowing the function to be used before it is defined.
functionReturnType myFunctionName(optionalArgumentType optionalArgument = defaultValue);
 
Function Implementation

functionReturnType myFunctionName(optionalArgumentType optionalArgument);
{
   // put your code here
}

 
Function calls

myFunctionName(); // Use the default value
myFunctionName(1); // Use specific value

 
Example
  1. int myFunction(int optionalArgument = 1);
  2.  
  3. void setup() {
  4. Serial.begin(9600);
  5. }
  6.  
  7. void loop() {
  8. Serial.println(myFunction()); // Use the default value
  9. Serial.println(myFunction(2)); // Use specific value
  10. }
  11.  
  12. int myFunction(int optionalArgument)
  13. {
  14. return optionalArgument;
  15. }
 
The breadboard.zip hardware configuration archieve is not working on Arduino software version 1.0 and above
 
Here is my boards.txt setup for ATMega328 which is working on version 1.0 and above
Modify the file ...\your_arduino_folder\hardware\arduino\boards.txt by adding these few lines:

##############################################################
atmega328bb.name=ATmega328 Optiboot (8MHz internal clock)
atmega328bb.upload.protocol=arduino
atmega328bb.upload.maximum_size=30720
atmega328bb.upload.speed=57600
atmega328bb.bootloader.low_fuses=0xE2
atmega328bb.bootloader.high_fuses=0xDA
atmega328bb.bootloader.extended_fuses=0x05
atmega328bb.bootloader.path=arduino:optiboot
atmega328bb.bootloader.file=optiboot_atmega328.hex
atmega328bb.bootloader.unlock_bits=0x3F
atmega328bb.bootloader.lock_bits=0x0F
atmega328bb.build.mcu=atmega328p
atmega328bb.build.f_cpu=8000000L
atmega328bb.build.core=arduino
atmega328bb.build.variant=standard

 
And here is the boards.txt setup for ATMega8

##############################################################
atmega8noxtal.name=ATmega8 Optiboot (8MHz internal clock)
atmega8noxtal.upload.protocol=arduino
atmega8noxtal.upload.maximum_size=7168
atmega8noxtal.upload.speed=38400
atmega8noxtal.bootloader.low_fuses=0xe4
atmega8noxtal.bootloader.high_fuses=0xc4
#atmega8noxtal.bootloader.path=atmega8_noxtal
atmega8noxtal.bootloader.path=optiboot
atmega8noxtal.bootloader.file=optiboot_atmega8.hex
atmega8noxtal.bootloader.unlock_bits=0x3F
atmega8noxtal.bootloader.lock_bits=0x0F
atmega8noxtal.build.mcu=atmega8
atmega8noxtal.build.f_cpu=8000000L
atmega8noxtal.build.core=arduino
atmega8noxtal.build.variant=standard

 
Note: Do not modify the boards.txt in your Arduino sketch folder (eg. ...\My Documents\Arduino\hardware\...boardx.txt), it will not work.
 
 

Using an Arduino board to burn the bootloader
If your ATMega8/ATmega328 already configured to use external clock, then wire up the Arduino board & microcontroller as show in figure 1, otherwise (microcontroller configured to use internal clock) you can follow either figure 1 or figure 2.

Fig. 1 Using an Arduino board to burn the bootloader

 

Fig. 2 Using an Arduino board to burn the bootloader

  • Upload the ArduinoISP sketch onto your Arduino board.
  • From Tools>Board menu, select ATmega328 Optiboot (8MHz internal clock) if you want to burn the bootloader on ATMega328 microcontroller
  • From Tools>Board menu, select ATmega8 Optiboot (8MHz internal clock) if you want to burn the bootloader on ATMega8 microcontroller
  • From Tools>Programmer> menu, select Arduino as ISP
  • Select Burn Bootloader from Tools menu to start burning bootloader to microcontroller
Tuesday, 05 November 2013 20:36

Sharp GP2Y0A21红外线测距传感器

Sharp GP2Y0A21是一颗红外线测距传感器,易于使用,价钱廉宜,且低功耗。 规格如下:
  • 距离测量范围:10至80cm(4“到32”)
  • 工作电压:4.5V至5.5V
  • 输出类型:模拟电压
  • 平均功耗:35mA
  • 峰值功耗:约200mA
  • 允许的最大角度:> 40°
  • 更新频率/周期:25 Hz/40毫秒
Sunday, 03 November 2013 17:49

Sharp GP2Y0A21 IR distance sensors

Sharp GP2Y0A21 is an infra-red distance measuring sensor unit,  it is extremely effective, easy to use, very affordable and has low power consumption. specification as follow:

  • Distance measuring range: 10 to 80cm (4" to 32")
  • Operating voltage: 4.5V to 5.5V
  • Output type: Analog voltage
  • Average power consumption : 35 mA
  • Peak power consumption : about 200 mA
  • Output voltage differential over distance range: 1.9V 
  • Maximum allowable Angle : > 40 °
  • The frequency of updates/cycle : 25 Hz/40 ms
Burning sketches to the Arduino board with an AVRISP MKII programmer without using the bootloader. This allows you to use the full program space (flash) of the chip on the Arduino board. So with an ATmega328, you will get 32KB instead of 30KB of space. It also avoids the bootloader delay when you power or reset your board.
Tuesday, 22 October 2013 22:13

Identify which Arduino bootloader do I have

Here’s an Arduino sketch which tries to identify the bootloader and reports it on the serial port
 
The sample output look like this:
[bootCheck.2]
  CRC 2048b @ 0x7800 = CD70
  CRC 512b @ 0x7E00 = FD70
Boot loader: OptiBoot 4.4
 

// Detect which type of boot loader is present, using a fixed built-in table
// 2012-03-06 <This email address is being protected from spambots. You need JavaScript enabled to view it.; http://opensource.org/licenses/mit-license.php

#include <avr/pgmspace.h>
#include <util/crc16.h>

#define VERSION "2"

// list of all known boot loaders with their unique signatures
struct { word crc; const char* desc; } signatures[] = {
0x489C, "Duemilanove",
0xF1A0, "Nanode (Duemilanove mod)",
0xFD70, "OptiBoot 4.4",
0, 0
};

static word CalculateChecksum (word addr, word size) {
word crc = ~0;
prog_uint8_t* p = (prog_uint8_t*) addr;
for (word i = 0; i < size; ++i)
crc = _crc16_update(crc, pgm_read_byte(p++));
Serial.print(" CRC ");
Serial.print(size);
Serial.print("b @ 0x");
Serial.print(addr, HEX);
Serial.print(" = ");
Serial.println(crc, HEX);
return crc;
}

static const char* IdentifyBootLoader (word addr, word size) {
word crc = CalculateChecksum(addr, size);
for (byte i = 0; signatures[i].desc != 0; ++i)
if (signatures[i].crc == crc)
return signatures[i].desc;
return 0;
}

void setup () {
Serial.begin(57600);
Serial.println("\n[bootCheck." VERSION "]");

const char* message = IdentifyBootLoader(0x7800, 2048);
if (message == 0)
message = IdentifyBootLoader(0x7E00, 512);
if (message == 0)
message = "(UNKNOWN)";

Serial.print("Boot loader: ");
Serial.println(message);
}

void loop () {}


Tuesday, 15 October 2013 23:27

Arduino通过74HC595扩展IO

 

74HC595是一个价格廉宜的8位移位寄存器,通过3个数据引脚(STCP, SHCP, DS),可以控制几乎无限量的输出。

DS是一个串行数据输入端,每当时钟输入(SHCP)上升沿到来时DS引脚当前电平值在移位寄存器中会移一位,连续进行8次同样的动作,就可以完成全部(Q0至Q7)移位。最后当STCP(Latch)上升沿到来时,移位寄存器的值将会被锁定在存储器里,并从Q0至Q7引脚输出。

Arduino UNO只有14+6个数字输出,如果需要更多的输出,其中之一的方法就是通过74HC595来取得更多的输出。 

Friday, 27 September 2013 20:40

Arduino BIT manipulations

Code below set third pin to HIGH without changing the state of any of the other pins
bitSet syntax: bitSet(x, n)
  • x: the numeric variable whose bit to set
  • n: which bit to set, starting at 0 for the least-significant (rightmost) bit

//initialized all pins to LOW
byte pinState = B00000000;

//set the third pin high
bitSet(pinState, 2); //pinState = B00000100

 
  
Code below set third pin to LOW without changing the state of any of the other pins
bitClear syntax: bitClear(x, n)
  • x: the numeric variable whose bit to clear
  • n: which bit to clear, starting at 0 for the least-significant (rightmost) bit

//initialized all pins to HIGH
byte pinState = B11111111;

//set the third pin LOW
bitClear(pinState, 2); //pinState = B11111011

 
 
Code below set each pin as LOW or HIGH without changing the state of any of the other pins
bitWrite Syntax: bitWrite(x, n, b)
  • x: the numeric variable to which to write
  • n: which bit of the number to write, starting at 0 for the least-significant (rightmost) bit
  • b: the value to write to the bit (0 or 1)
byte pinState= 0; //initialized all pins to LOW (B00000000)
bitWrite(pinState, 0, HIGH); //set first pin to HIGH, pinState = B00000001
bitWrite(pinState, 3, HIGH); //set third pin to HIGH, pinState = B00001001
bitWrite(pinState, 0, LOW); //set first pin to LOW, pinState = B00001000
 
 
Reads a bit of a number.
bitRead Syntax: bitRead(x, n)
  • x: the number from which to read
  • n: which bit to read, starting at 0 for the least-significant (rightmost) bit

byte pinState = B10101010;
for (int i=0; i<8; i++) {
   theBit = bitRead(pinState, i);
}

 

 

Wednesday, 25 September 2013 18:40

Using 74HC595 Shift Registers with Arduino

The 74HC595 is a very handy IC used in many microcontroller projects, it is a 8-bit serial-in, serial/parallel-out shift register with output latches.
 
Data is shifted on the positive-going transitions of the shift register clock input (SHCP). The data in each register is transferred to the storage register on a positive-going transition of the storage register clock input (STCP).
 
The shift register has a serial input (DS) and a serial standard output (Q7S) for cascading. Data in the storage register appears at the output whenever the output enable input (OE) is LOW.
 
This is incredibly helpful if you need more digital outputs then the 14+6 that the ATmega328 on the Arduino Uno provides, with only 3 data pins, you can control an almost unlimited amount of outputs.
 
Upon completion of this tutorial, you should be able to controlling the 74HC595 as below:
  • Using 74HC595 Shift Registers with Arduino
  • Daisy chaining 74HC595 shift registers
  • Different ways (binary, decimal, hex) to hold the data using an array
  • Using bitshift, bitwrite operators
  • Direct port access for faster manipulation of the IO pins 
Saturday, 17 August 2013 16:51

Minimal Arduino with 8MHz internal clock

Build your own DIY Arduino board with only one passive component, it is very easy and simple. This is probably the most minimal ATmega328 based Arduino.
 
Part list
  • ATmega328
  • 28 pins IC socket
  • 10K resistor
  • Strip board 
Saturday, 20 July 2013 22:31

DIYLC电子绘图软件

DIYCL V3
DIYLC (DIY Layout Creato)是电子爱好者用来设计电路图的绘图软件,它可以设计原理电路图(Schematic)、洞洞电板路板(Strip board)、面包电路板等(Breadboard)。
 
DIYLC是一个免费与开源软件现在是3.27.0,应该是正式使用版本了。今天试用了这版本,感觉比之前的旧版本好用了许多,很适合初学者,所以决定在此与大家分享一下。
Mirror mirror on the wall
远看是美女,近看是自己。是了,这就是魔镜。
你进入厕所,有位美女笑望着你,你也色眯眯的望着美女,同时赶紧去解决你的"第一任务"。完事后,你逼不及待的靠近美女,想一亲芳泽......啊!美女不见了,眼前竞然出现一色邪男人,那不就是你自己吗!。很神奇呀!原来是魔镜在作怪。
你照着魔镜,看看自己的脸孔有没有红,看看口角有没有口水,看看鼻子有没有血,拍拍胸膛,感觉良好,要离开厕所了。忽然之间,美女又出现了。这时你脸兒红了,口角流口水了,鼻孔喷血了,心跳加速了。离开厕所後,发觉裤子也湿渗了。很励害呀,正是魔镜的法力。
一天之内,你进出厕所几十趟,结果你五孔流精,精尽人亡。很可怕呀!这就是魔镜的威力。
男士们呀!别只顾着往厕所跑,很伤身体呀!来!轻松一下,慢慢欣赏豆豆先生与魔镜的片段,暂时忘了世界上有厕所的存在。
魔镜之谜
为了拯救女人深爱的男士,英俊帅气的我不惜动用大量资金以及耗尽一生青春,同时冒著精流不止的生命危险去研究魔镜,今天终于解开了魔镜千年之谜。
Aarduino communicate with Vixen
Vixen is a free and popular light show creator software. With a PC and some hardware, anyone can have a professional-looking lighting display synchronized to music.
 
The latest version is Vixen3, the most attractive feature is supported for preview. Compare to Vixen2, Vixen3 is a bit difficult to use & lack of some features in Vixen2. Please correct me if I'm wrong.
 
This tutorial is based on Vixen2, please download Vixen2 and install it to your computer. Prior to Vixen2, you must have install Microsot.NET Framework 2.0 in your computer.
Explains how to bridge network using two wireless routers, the first (Host) router is configure as Access Point & the second router (TL-MR3020) is configure as Client mode. Same method should apply to all other OpenWRT routers as well.
 
Prerequisites
  • Host router configure as Access Point. If you already setup a wireless internet connection in your house, usually your modem is configured as Access Point mode.
  • A working OpenWRT on TP-LINK TL-MR3020 Portable 3G/4G Wireless N Router
 
The routers is configure as two different subnet, assume using settings below as the example.
  • Host router IP: 192.168.1.1
  • Host router subnet mask: 255.255.255.0 or 255.255.0.0 if you want to access 192.168.0.x from 192.168.1.x
  • Host router SSID: ABC
  • Client router IP: 192.168.0.1
  • Client router subnet mask: 255.255.255.0
Sunday, 07 July 2013 15:40

TP-LINK TL-MR3020 + OPENWRT + WEBCAM

This project uses an inexpensive TP-LINK TL-MR3020 Portable 3G/4G Wireless N Router with an Linux UVC supported camera to create an IP Camera that can be placed in a good location for surveillance.
 

Prerequisites

 
Saturday, 29 June 2013 16:25

Arduino电子密码锁

一个基于Arduino微控制器的密码锁,一般上用于防盗门。为了方便初学者学习与操作,这里提供了两个版本的电子密码锁源码。
 
读完文章与明白程序操作后,你将会如何应用:
  1. EEPROM字串存取
  2. 运用#include文件,把谋些函数(function)调去外部文件
  3. 简单的旋律处理
  4. 日期与时间处理
  5. 如何形成Press and hold
  6. 矩阵键盘应用与空闲(idle)侦察
  7. 密码处理与验证
  8. i2c LCD
  9. 非阻塞编程(Non blocking programming) 
After flashing the latest OpenWRT image file (openwrt-ar71xx-generic-tl-mr3020-v1-squashfs-factory dated 03-Jun-2013), my TL-MR3020 is bricked. All the LED is keep on blinking (about 3 seconds once) except power LED, and the network is getting connected and disconnected every 3 seconds. Very lucky that the problem was fiexed by using serial console and Tftpd32 method.
Friday, 07 June 2013 20:50

Extend WIFI Range with Another Router

With AP client router mode, it can connect to a wireless network and share the connection to its clients (see picture above). So you can use a router to extend the WIFI range.
 
 
Prerequisite
  • Primary wireless router configure as AP. If you already setup a wireless internet connection in your house, usually your modem is configured as AP mode.
  • Secondary wireless router (TL-WR1043ND or other DD-WRT compatible router) flashing with DD-WRT
Wednesday, 05 June 2013 23:10

Flashing TP-Link TL-WR1043ND with DD-WRT

 
TP-Link TL-WR1043ND is one of the best 2.4GHz routers available, it has won numerous awards including "Best Product", "Best Wireless Router", "Editor's Choice" and "Best Design".
 
Using DD-WRT can make your network infinitely more stable and easier to tweak. Click here for more about DD-WRT.
Saturday, 01 June 2013 11:44

Digispark红外接收器

Digispark Infrared Receiver
Digispark是一个基于ATTINY85微控制器且具備USB接口的开发板,使用Arduino IDE开发,编程与Arduino极相似。这里介绍如何利用家里的红外遥控器配合Digispark遥控设备。
 
Digispark是Digistump LLC (digistump.com)版权所有,请使用者仔细阅读Digispark使用协议和版权声明
 
Wednesday, 29 May 2013 18:41

Digispark Infrared Receiver

Digispark Infrared Receiver
Digispark is an Attiny85 based microcontroller development board similar to the Arduino line which is smaller and cheaper. Now you can connect an infrared detector to the Digispark and turn it to an infrared controller to control your devices.
 
Digispark is copyrighted by Digistump LLC (digistump.com) and the full license is here
 
Friday, 24 May 2013 21:09

Arduino PCB DIY

Arduino PCB
If your projects require many Arduino and you do not want to purchase the expensive full set of Arduino, here is the good place to go.
All the PCB design is single sided I sugggested to use toner transfer to make the PCB. You should Google "toner transfer" if you want to know more about it.
 
I should mention all the collection of PCB is not my own design, all credit goes to each respective authors.
Wednesday, 22 May 2013 22:03

Digispark DIY: The smallest USB Arduino

Digispark
Digispark is an ATtiny85 based microcontroller development board come with USB interface. Digispark is very small and inexpensive but less powerful than Arduino. Coding is similar to Arduino, and it use the familiar Arduino IDE for development.
 
Digispark is copyrighted by Digistump LLC (digistump.com) and the full license is here
 
Here is an article on how to making a Digispark, however if you want to purchase a finished product, you can always get it from  Digispark's author homepage.

Monday, 20 May 2013 21:01

自制Digispark: 最小USB Arduino

Digispark
Digispark是一个基于ATTINY85微控制器的开发板,体积小且价钱便宜,功能方面则没有Arduino般强大。代码与Arduino大同小異,也是使用Arduino IDE开发。
 
Digispark是Digistump LLC (digistump.com)版权所有,请使用者仔细阅读Digispark使用协议和版权声明
 
Digispark的特别之处是使用了USB与电脑沟通,省了USB至串口转换器。为此,Digispark必须占用2KB的快闪记忆体(Flash Memory)以便用来安装Bootloader。
Saturday, 27 April 2013 08:10

Arduino与I2C/TWI LCD1602模块

I2C LCD1602 Module
I2C/TWI LCD1602是由DFRobot生产的LCD模块。LCD1602模块应用了I2C接口(只用两条信号线),适用于引脚有限的微控制器。从上图看得出,LCD後方安装有一个可变电阻器,用来调整光线对比(contrast)。

LCD1602规则说明
  • 接口:I2C
  • I2C地址:0X27
  • 电源电压:5V
  • 重量:40克
Tuesday, 23 April 2013 12:17

Password access with Arduino using keypad

Arduino and Keypad
This example demonstrates how to use a 4x4 matrix keypad access password from an Arduino. Sketch below required to install password and keypad library, both available at Arduino Playground. Below list the functions of password library:

set(password)
Set the target password equal to password.

is(password)
Is the target password equal to password

append(character)
Append a character to the currently guessed password

reset()
Reset the currently guessed password

evaluate()
Is the guessed password equal to the target password?

Page 1 of 3
Back to Top