I'm having problems uploading a simple hello world program to my Arduino Mega 2560. I checked whether it would work when using the IDE, and it does. I do not, however, want to use the IDE. (I had to chmod a+rw /dev/ttyACM0 to make it work, by the way.)
The error is well-known and much discussed on the net. None of the solutions I found so far apply to me though, because I'm using the makefile rather than the IDE, and I'm on Linux. The Makefile I'm using:
ARDUINO_DIR = /usr/share/arduino
TARGET = test
ARDUINO_LIBS =
MCU = atmega2560
F_CPU = 16000000
ARDUINO_PORT = /dev/ttyACM0
AVRDUDE_ARD_BAUDRATE = 115200
AVRDUDE_ARD_PROGRAMMER = arduino
include /usr/share/arduino/Arduino.mk
The source compiles fine, but during the upload-phase, avrdude is complaining:
/usr/share/arduino/hardware/tools/avr/../avrdude -q -V -D -p atmega2560 -C /usr/share
/arduino/hardware/tools/avr/../avrdude.conf -c arduino -b 115200 -P /dev/ttyACM0 \
-U flash:w:build-uno/test.hex:i
avrdude: stk500_recv(): programmer is not responding
avrdude: stk500_getsync() attempt 1 of 10: not in sync: resp=0x00
I think this is a simple matter of having the flags set-up wrongly. Any ideas?
AVRDUDE_ARD_PROGRAMMER = arduino
the Arduino MEGA (atmega2560) uses a different bootloader than the Uno, and needs a different programmer type. Change "arduino" to "wiring" (or "stk500v2")
Related
I am configuring a vs-code extension to send a cross-compiled binary to a raspberry pi.
Every step from compiling to copying the file runs fine.
ssh pi#123.123.123.123 "sudo mkdir /home/pi/remotePi/";
ssh pi#123.123.123.123 "sudo rm /home/pi/remotePi/blink_example";
ssh pi#123.123.123.123 "sudo chown pi /home/pi/remotePi/";
scp -l 8192 build/blink_example pi#123.123.123.123:/home/pi/remotePi/ &&
ssh pi#123.123.123.123 "echo "scp complete"" &&
ssh pi#123.123.123.123 "/home/pi/remotePi/blink_example"
Output:
mkdir: cannot create directory ‘/home/pi/remotePi/’: File exists
blink_example 100% 8692 277.3KB/s 00:00
scp complete
But when I try to run the file through an SSH command, the command stalls.
ssh pi#123.123.123.123 "home/pi/remotePi/blink_example"
It will eventually run, but it can take around 10 minutes. If I ssh into the pi and run the binary through an actual terminal, it runs immediately.
I have noticed that when it finally runs (using my extension), there are a lot of print statements (the test code just prints the read value from a pin). Does that mean it is running, but I'm maybe not getting the prints until there is enough to fill a packet?
So my question is, how can I run a binary on a remote machine and receive the terminal output in a timely manner?
Edit
I modified my program to not have any delays between print statements (essentially spamming stdout). This resulted in the ssh command ssh pi#123.123.123.123 "/home/pi/remotePi/blink_example" to return immediately and with all the prints.
This leads me to believe that there is a buffer that I need to fill (or limit the size of) before any terminal information is returned to the local device from the remote.
I figured out a solution, but it doesn't answer any of the questions about why spamming stdout will cause ssh to give a terminal output sooner.
In the original blink_example, I was using printf("pin 17: %d\n", digitalRead(17)); for displaying the value.
I converted the test application to c++ (not a terribly difficult task) and used std::cout << "pin 17: " << digitalRead(17) << std::endl;. Using this caused the terminal to give feedback right away.
The question pretty much says it all. I basically want to create a driver that is compatible with my current MacOS (Catalina). The issue I'm facing is that my printer (with scanner) currently will only scan pages and print them out. I'd like to be able to use my scanner to save an image of a scanned document.
I'm honestly not sure if writing a driver is the best way to do this but the manufacturer (Canon) no longer has drivers for this old scanner. But it works just as well as the day we got it so I REALLY don't want to have to toss this one out and buy a new one.
UPDATE: currently stuck with the following:
rabdelazin#rabdelazim Downloads % device=$(sane-find-scanner | awk '/Canon/{print $NF}')
rabdelazin#rabdelazim Downloads % echo $device
libusb:020:029
rabdelazin#rabdelazim Downloads % scanimage --device Canon:$device -x 210 -y 297 --mode color --resolution 240 --format=tiff --depth 8 > ~/Downloads/scan.tiff
scanimage: open of device Canon:libusb:020:029 failed: Operation not supported
I have an EPSON Perfection 4990 Photo on macOS, so I cannot give you full code and examples for your Canon but it may get you started. I spend my life in Terminal rather than using GUIs for anything so I just scan the full area of the platten at full resolution and do whatever I need later with ImageMagick or Photoshop if necessary.
So, to get it going I installed homebrew from here. Then I installed some packages:
brew install libusb
brew install sane-backends
Then I can find my scanner with:
sane-find-scanner
Sample Output
found USB scanner (vendor=0x04b8 [EPSON], product=0x012a [EPSON Scanner]) at libusb:003:002
Now you need the last word on that line, the libusb:003:002 part, with my EPSON, I use:
sane-find-scanner | awk '/EPSON/{print $NF}'
You will need to see what you get, and adapt slightly.
SampleOutput
libusb:003:002
So, in order to scan, I capture that in a bash variable called device and do this:
device=$(sane-find-scanner | awk '/EPSON/{print $NF}')
scanimage --device epson:$device -x 210 -y 297 --mode color --resolution 240 --format=tiff --depth 8 > ~/Desktop/scan.tif
I put the whole lot in a bash script called scan like this:
#/bin/bash
TMP="$HOME/Desktop/scan.tif"
# Find libusb device name
device=$(sane-find-scanner | awk '/EPSON|HP/{print $NF}')
if [ -z $device ]; then
echo ERROR: Unable to find libusb device
exit 1
fi
echo Found scanner at: $device
# Now scan full-size, colour, hi res
scanimage --device epson:$device -x 210 -y 297 --mode color --resolution 240 --format=tiff --depth 8 > "$TMP"
# Check we got a file
if [ ! -s "$TMP" ]; then
echo ERROR: Empty scan
exit 1
fi
My script has some further, optional, ImageMagick stuff at the end to create a Web-usable JPEG, if you add this you will need to do:
brew install imagemagick
Then add this to the script above:
# Copy the file to User's Desktop and number nicely...
# ... save as hi-res 16-bit TIF
# ... and medium res, medium quality JPG for web use
cd ~/Desktop
i=0
while :; do
base=$(printf "scan-%03d" $i)
if [ ! -f "${base}.jpg" ]; then
cp "$TMP" "${base}.tif"
convert "$TMP" -resize 2000x2000 -quality 85% "${base}.jpg"
break
fi
((i++))
done
Here are a couple of resources I found helpful when working it all out. You can debug the scanimage program with:
SANE_DEBUG_SNAPSCAN=128 scanimage -L
This resource was useful.
You can get help like this:
scanimage --help -d epson
Note that you may also be able to use a Raspberry Pi or similar small, low-cost Linux machine as a "scanner server". Basically you would attach your scanner via USB to the Raspberry Pi and run SANE on the Raspberry Pi. Once you get it working, you could run saned which is a daemon service, on the Raspberry Pi, that listens on the network for other devices (such as your Mac) making requests to scan. It does the scan, using its Linux SANE drivers and delivers the image back over the Ethernet to the Mac (or other) client. I know you dislike this option, but there may be future readers...
Keywords: macOS, OSX, scan, scanner, scanning, EPSON, Canon, HP, libusb, SANE, sane-backends
Well after a LOT of trial and error, I've finally come up with a solution.
TL;DR: I made a print server out of a raspberry-pi and installed cups and set the printer to be shared through the server. Works like a charm!
It took quite a bit of investigation but as part of reviving an old laptop, I got it running by installing Ubuntu 20.04. Just for kicks I decided to try and print something from the laptop. I had to install CUPS and maybe a few other packages but it worked. That got me thinking that I should just make a print server that knows how to talk to the printer so all the other machines can come and go but my printer should still work.
When booted, my raspberry checks if the program called reader is running. If it is, it does nothing, but if not, it runs it.
After a bunch of time, a few hours (between 2 and 4 hours) the raspberry is completely lost. I can't connect with SSH, the program that ran is not running anymore, etc.
I tried to run a SSH client to get the error while i'm connected to it so I can watch what's in the dmesg and so on, but here is what I get :
pi#raspberrypi:~ $ tail -f /var/log/syslog
-bash: tail: command not found
pi#raspberrypi:~ $ sudo tail -f /var/log/syslog
-bash: /usr/bin/sudo: No such file or directory
pi#raspberrypi:~ $ ls
-bash: ls: command not found
pi#raspberrypi:~ $ /bin/ls
-bash: /bin/ls: No such file or directory
pi#raspberrypi:~ $
pi#raspberrypi:~ $ cd /bin/
pi#raspberrypi:/bin $ ./ls
-bash: ./ls: No such file or directory
If I stop the SSH session and try to connect again :
pi#raspberrypi:/bin $ logout
Connection to 10.25.168.59 closed.
root#me:/home/user# ssh pi#10.25.168.59
Read from socket failed: Connection reset by peer
I can ping the raspberry pi and NMAP says something hilarious :
Nmap scan report for 10.25.168.59
Host is up (-0.087s latency).
MAC Address: xx:xx:xx:xx:xx:xx (Raspberry Pi Foundation)
Then if I unplug the raspi and plug it back, I can connect back to it and here are the logs from syslog : http://sprunge.us/lSSnj7
We can see at 11:17:08 it's booting but nothing more.
And here's maybe a thing that can help : The pi has the red light constantly ON while the green one blinks following that pattern : on for 8s, off for 0.5s
For information, my program is written in C, it opens an USB port (it is a barcode scanner) and does nothing about shutdown or reboot the machine.
I've already checked for memory peaks, CPU peaks, zombies processes, but nothing. I use only 60 Mb of RAM on 1 Gb, CPU is used at less than 2%. 110 tasks and 0.03 load average.
Why does the raspberry freezes or reboots (without killing the SSH session) but does not completely reboot, because my reader is not launched again ?
Any help would be very much appreciated. Thanks
Maybe some hardware problems on the SD card ?
These "not found" look like when the system is in really bad shape after a hardware failure or a sudo rm -rf /*
My setup is complicated and I think I have a clear way ahead, but please let me know if you see a better way to accomplish my end state of using a terminal window over Xbee. My use case is that RPI #1 has internet connectivity, but RPI #2 does not, and I want to fully control and access RPI #2 via RPI #1 over Xbee.
I have x2 Raspberry Pi 3B+ and am using x2 Xbee Pro S3B modules to communicate between the RPIs over Xbee USB Development Shields. The Xbees show on the RPIs as /dev/ttyUSB0. I want to use the Xbees as a transportation layer to the RPIs, much like 802.11/15 or plain old ethernet would be used in a headless situation with bash. The Xbees are running at 115200 baud rate, and are named and setup via the X-CTU tool. I have no illusions of high speed data, but want to "see" RPI #2 terminal on RPI #1, the same as when SSH is accomplished with traditional transport layers.
I am able to use the Xbees in Transparent Mode, and send plain text with Screen, Minicom, "echo "text here" > /dev/ttyUSB0", and "cat < /dev/ttyUSB0". Despite the ability to pass messages, I want to use these plain text messages as bash input. For example, when I pass the command ls via any of the three methods listed from RPI 1, I want to have bash exectue "ls" on RPI 2, not just see it listed on the screen for RPI 2.
I've found several tools for Xbee, but don't want to wire up the GPIO pins and go that method; I want to use the Xbees as simple transport, nothing more. How do I pass text from /dev/ttyUSB0 to bash as a command, and see the results? Short of a more direct route, I'm considering using crontabs and an executable file that is erased and re-written to accomplish this task, but feel that is a last, very ineffective, method.
Is there some tool I am missing that does this already? Can I "screen" over a serial port as command line and serial I/O simultanously?
I found pyserial, which could allow for a TCP binding to the /dev/ttyUSB0 port, but am not sure if that is the right way to go or not. As of now, my code is as simple as
RPI #1:
echo "ls" > /dev/ttyUSB0
RPI #2:
cat < /dev/ttyUSB0
I was able to send and recieve commands from command line of a local (although remoted) XBee host to a remote (secondary, off net) Xbee host. I found the answer when I started looking at how serial devices could open a login terminal, and arrived at the getty tool. Here are my setup instructions for Transparent Mode use, I am still trying to get python-xbee and other tools to work to allow for the same concept, but via API mode. Note that the below instructions are a 95% solution, but should get the common user to a solid way ahead. I am not the original author of the steps below in their format, but found each step and combined them through various other Q&A forums to arrive at a solution:
First, acquire Digi Xbee X-CTU software (does not install on ARM devices such as Raspberry or Odroid):
XCTU:
Install from the following Digi.com link, but navigate to the corrresponding software FTP link:
https://www.digi.com/support/productdetail?pid=3352&type=drivers
Linux 64 Bit: ftp://ftp1.digi.com/support/utilities/40002881_R.run
Linux 32 Bit: ftp://ftp1.digi.com/support/utilities/40002880_R.run
Windows: ftp://ftp1.digi.com/support/utilities/40003026_T.exe
Mac: ftp://ftp1.digi.com/support/utilities/40003026_T.exe
Install X-CTU Via:
sudo wget ftp://ftp1.digi.com/support/utilities/40002880_R.run
sudo mv 40002881_R.run xctu_64bit.run
sudo chmod +x xctu_64bit.run
sudo ./xctu_64bit.run
Find X-Bee Device:
make sure Xbee is not plugged into a hub, power will be too little, recognizable via the below error, YMMV:
dmesg | grep ttyUSB0
and returning error: [ 228.800021] ftdi_sio ttyUSB0: failed to get modem status: -32
lsusb -v -d 0403:6001
sudo nano /boot/cmdline.txt
change the console tty device from AMA to USB, then for the kgdboc, which allows the remote end to watch the boot process, add/make match as appropriate
console=ttyUSB0,115200 kgdboc=ttyUSB0,115200
sudo nano /etc/inittab
make sure to uncomment (remove #) if present, change tty from AMA to USB
T0:23:respawn:/sbin/agetty -L ttyUSB0 115200 vt100
On Ubuntu x86 system, use X-CTU via
sudo ./XCTU.desktop
update firmware to the latest version
currently 8075 for the Pro S3B, then set baud rate to 115200 on each device
other xbees on in the vicinity can be updated by using a local xbee via X-CTU, then setting the api mode to “api mode with escapes”. Note that Transparent Mode should be used unless you have an indepth knowlege to make API mode work. I started with Transparent Mode to demonstrate the below works, but have since moved to API mode to gain the enhanced send-recieve control capabilities (pending a working version as of this writing).
do the same steps for all the devices that will be used on the network; once the local device is complete, other remote devices can be updated if visible (close enough).
Close out X-CTU and add the current user to the dialout group via:
sudo usermod -a -G dialout root
reboot then:
Setup Minicom Via:
sudo aptitude install minicom
minicom -s
serial port setup
a, set to /dev/ttyUSB0, then hit enter
e, set baud rate to 115200, then hit enter
hit enter again to close the window and arrive at the configuration page of minicom
select to save as dfl, followed by enter
then move to exit, and hit return
test connection to a locally connected device via
three plus symbols without hitting return
if it replies “ok” in a few seconds or less, all is well
OR Screen:
screen /dev/ttyUSB0
again, if you see a login prompt, you are connected. Note that screen is probably the best choice for most users; it has the inherent quality of ease of use (when compared to Minicom), handles low bandwidth connections with ease, and stays alive despite a disconnect from remote host. Ctl+a and then k will disconnect.
Install Coreutils to add more options than Minicom (Screen is also advisable):
sudo aptitude install coreutils && screen
stty -F /dev/ttyUSB0 -a
this will check serial port capabilities and settings
Communicate with your devices:
Note you interact with your network on a local machine with an X-Bee plugged in, or on a remote device you SSH over the internet, as long as it has an X-Bee attached. Also, note that the below settings to rc.local weren't keeping my settings after a reboot; this is a work in progress. I was setting them manually until I got automation worked out.
Also, I added rc.local to the RPI manually, the how-to for that is out there somewhere:
sudo systemctl stop serial-getty#ttyAMA0.service
sudo systemctl disable serial-getty#ttyAMA0.service
sudo systemctl enable serial-getty#ttyUSB0.service
sudo nano /etc/rc.local
add the below before exit 0
The stty line is twice because it has been noted that the first instance changes the reported baud rate to 9600, the second to 115200. If you are doing this manually, do a “stop” then re-do the start command to receive the prompt. This could be automated; I will update this post with a process monitor.
stty -F /dev/ttyUSB0 speed 115200 cs8 -cstopb -parenb raw
stty -F /dev/ttyUSB0 speed 115200 cs8 -cstopb -parenb raw
sudo systemctl start serial-getty#ttyUSB0.service
Then, use Minicom, Screen, or "cat" and "watch" to view messages sent. When using Minicom you will receive a login prompt via the above directions. As previously stated, I am still trying to get this working smoothly for API mode, but at least I know I have connectivity and can do basic command & control via the command line remotely with Transparent Mode, including running command line programs and commands. Transparent Mode does not offer any enhanced RF propagation correction techniques, hence my desire to get API mode working; RSSI values and error correction would be nice.
I need to give Internet access to a VM under Vmware fusion 7 in Host-Only mode. I know how to do it in Linux, with the following IPtables rules:
sysctl -w net.ipv4.ip_forward=1
iptables -A FORWARD -o eth0 -i vboxnet0 -s 192.168.56.0/24 -m conntrack --ctstate NEW -j ACCEPT
iptables -A FORWARD -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT
iptables -A POSTROUTING -t nat -j MASQUERADE
But I can not find out how to do it in MacOS Sierra. Any help?
Thanks in advance!
You should look into configuring pf (packet filter) in macos (or OS X) it's been included since Lion.
It Is substantially different from what you're used to, so there will be a learning curve.
pf originates on OpenBSD. They have information that includes examples on how to write pf rules.
https://www.openbsd.org/faq/pf/config.html#config
Using it for NAT has it's own manual:
https://www.openbsd.org/faq/pf/nat.html
To get started on the mac:
http://krypted.com/mac-security/a-cheat-sheet-for-using-pf-in-os-x-lion-and-up/ it's a bit old, but still should you get started.
I've no idea how vmware fusion does networking on the mac (parallels tends to add a ton of interfaces you see on the mac), I'd start with simple examples and slowly grow to a more complex setup.
I asked the same question in apple.stackexchange.com and here is the solution:
https://apple.stackexchange.com/questions/265237/corresponding-ipfw-rules-in-macos-for-this-iptables-rules/265298#265298