Difference between revisions of "Project:Arduino Rotary Encoder Menu System"
Line 142: | Line 142: | ||
my ($scr_w, $scr_h) = $mw->maxsize(); | my ($scr_w, $scr_h) = $mw->maxsize(); | ||
t "maxsize says: $scr_w x $scr_h"; | t "maxsize says: $scr_w x $scr_h"; | ||
− | $mw->geometry("656x512+0+0"); | + | #~ $mw->geometry("656x512+0+0"); |
− | + | $mw->geometry("680x540+0+0"); | |
+ | #~ $mw->FullScreen; | ||
#~ $mw->geometry(($mw->maxsize())[0] .'x'.($mw->maxsize())[1] . "+0+0"); | #~ $mw->geometry(($mw->maxsize())[0] .'x'.($mw->maxsize())[1] . "+0+0"); | ||
− | my $c = $mw->Canvas(-bg => " | + | my $c = $mw->Canvas(-bg => "yellow", -width => 680, -height => 540)->pack; |
# in theory we should be able to scroll infinitely but let's stick to something reasonable | # in theory we should be able to scroll infinitely but let's stick to something reasonable | ||
#$c->configure(-scrollregion => [0,0, 600, 400]); | #$c->configure(-scrollregion => [0,0, 600, 400]); | ||
Line 153: | Line 154: | ||
my $menu_h = 100; | my $menu_h = 100; | ||
+ | # it don't work! | ||
+ | #~ invisible_cursor(); | ||
+ | |||
+ | # warp pointer tests... | ||
+ | $mw->after(100, sub {warp(20,20)}); | ||
+ | |||
+ | sub warp { | ||
+ | my($x, $y) = @_; | ||
+ | t "warp pointer to $x $y"; | ||
+ | $c->focus; | ||
+ | $mw->eventGenerate("<Motion>", | ||
+ | -when => 'head', | ||
+ | -x => $x, -y => $y, -warp => 1 | ||
+ | ); | ||
+ | } | ||
+ | |||
+ | # keybinding tests... | ||
+ | $mw->bind('<KeyPress>' => \&print_keysym); | ||
+ | |||
+ | sub print_keysym { | ||
+ | my($widget) = @_; | ||
+ | my $e = $widget->XEvent; # get event object | ||
+ | my($keysym_text, $keysym_decimal) = ($e->K, $e->N); | ||
+ | print "keysym=$keysym_text, numeric=$keysym_decimal\n"; | ||
+ | } | ||
+ | |||
+ | # hide cursor | ||
+ | sub invisible_cursor { | ||
+ | my $bitmapfile = Tk->findINC('trans_cur.xbm'); | ||
+ | my $maskfile = Tk->findINC('trans_cur.mask'); | ||
+ | $mw->configure(-cursor => [ '@' . $bitmapfile, $maskfile, 'black', 'white' ] ); | ||
+ | } | ||
# handy font chooser | # handy font chooser | ||
#~ $mw->Button( | #~ $mw->Button( | ||
− | + | #~ -font => $font, | |
− | + | #~ -text => "Font", | |
− | + | #~ -command => sub{choose_font()}, | |
#~ )->pack(); | #~ )->pack(); | ||
Line 193: | Line 226: | ||
sub menubox { | sub menubox { | ||
− | + | my($t, $mx, $my) = @_; | |
− | + | my $x1 = $mx * $menu_w; | |
− | + | my $y1 = $my * $menu_h; | |
− | + | my $x2 = $x1 + $menu_w; | |
− | + | my $y2 = $y1 + $menu_h; | |
− | + | $c->createRectangle($x1, $y1, $x2, $y2, | |
− | + | -fill => "blue", | |
− | + | -activefill => "green", | |
− | + | -outline => "green", | |
− | + | -activeoutline => "orange", | |
− | + | ); | |
− | + | $c->createText($x1 + ($menu_w/2), $y1+ ($menu_h/2), | |
− | + | -text => "$t", | |
− | + | -font => $font, | |
− | + | -fill => "black", | |
− | + | ); | |
} | } | ||
Revision as of 00:31, 30 July 2012
I have recovered a number of ALPS rotary encoders from discarded industrial CRT monitors. I'm working on building a user interface menu system that makes use of the rotary encoders as the sole input technique.
multiple encoders
Try out http://code.google.com/p/adaencoder/ and PinChangeInt library (http://code.google.com/p/arduino-pinchangeint/) see...
http://arduino.cc/playground/Main/RotaryEncoders#Example14
See if it can cope with two encoders at rapid rate usage.
OK, working well --Michael Erskine 18:10, 29 July 2012 (EST)
When using the Raspberry Pi as the menu display system we need to do a few things to a stock raspbian install...
- auto login and start X: use option in raspi-config
- switch off screen blanking: /etc/lightdm/lightdm.conf in SeatDefaults section "xserver-command=X -s 0 -dpms"
- auto start application
Here I'm building a Perl Tk menu application prototype using Tk::Canvas. I haven't yet wired up the serial as I'm just trying out some graphic styles on the small PAL LCD screen.
moving the cursor with Perl Tk