I am a real big fan of the Raspberry PI foundation. They do make some awesome devices that indeed enable a lot of people around the world learning robotics, domotica and programming. Hell this blog is hosted on a Raspberry PI 3 and it works like a charm. So I am a real big fan, but there’s just one thing that continues to annoy me. The prices that everybody mention when they are talking about Raspberry PI’s. The PI Zero is being called the $ 5 computer and the PI 3 is being called the $ 35 computer and these prices are simply not correct.
The real price
If you want to use the PI Zero you do need at least an SD card. Depending on the type and size it will cost you an extra $ 10. But you also need a power supply, which will add another $ 5 to the bill and then, well if you want to attach a keyboard, mouse, WiFi or Bluetooth, you will need a USB adapter and USB hub which will add at least another $ 5 to your bill. And then you might want to protect your PI Zero, so you’ll need a case that costs at least $ 5. So you will end up with a bill of $ 30 which is 6 times as expensive as the mentioned $ 5. Truth to be told, you can reuse the USB adapter and USB hub on another PI Zero as long as you do not require any WiFi or Bluetooth connection at all or buy a PI Zero W which costs $ 10. So $ 30 is really the bare minimum price you can get a away with.
If you want to use the PI 3 you’ll need to add an SD card, a decent power supply – I highly recommend you to use the official Raspberry PI one – , and case and you will end up with a total of at least $ 40 + $ 10 + $10 = $ 60.
If you want to use a Raspberry PI in any of your projects, by all means do. They are really great machines and very good value for money, but don’t expect you can get away with spending just $ 5 or $ 35 as they do cost you a lot more.
I have a confession to make. I do acting. Love to do acting and as I’m an amateur this also means that I sometimes have to do light and sound when I do not have a role in the play myself. For years this has been done by an elder guy who unfortunately has left the club and I was left with his legacy: “A set of CD players hooked up to a mix panel”. Hmmm… CD’s? That’s not my cup of tea, so I decided to replace all playback devices with a simple Raspberry Pi, capable of playing back all popular type of audio files and the option to mix them with some audio effects when required. The on-board sound of the Raspberry Pi is not really good though so I had to add a DAC. In this blog post I’ll shortly explain how I managed to install and configure a PiFi DAC and Mixxx on a Raspberry Pi 3 in such a way that it works flawless.
Step 1: Buy a PiFi
Even though the HiFiBerry looks really nice, I considered it pretty costly. After a lot of reading I decided to go for a PiFi which can be bought on AliExpress for around € 25,- including a nice acrylic case and free shipment.
Assemble the kit and you are good to continue to step 2.
One special note: Use the bolts of the acrylic case as placeholders to lift the Raspberry Pi up from the table. This lets it dissipate heat from its processor which is located at the bottom more easily.
Step 2: Download and install Raspbian with Pixel
As we use Mixxx as the audio mixing software which cannot run from a console, we need a UI with a desktop. The fastest and most stable running and thus best choice is Rasbian with Pixel desktop. Just follow the guide on how to get the Pi up and running. Run the raspi-config as you would do normally, but DON’T enable the experimental OpenGL driver as Mixxx does not like that.
Step 3: Configure the Pi and its Fi
The configuration of the PiFi is easy once you know how. Open a console and execute the following commands while you answer “Y” on any questions. sudo apt-get update
sudo apt-get upgrade
This forces the Raspberry Pi to update its kernel to the latest. If you do not execute this action, you will not be able to use Mixxx without a lot of stutter caused by buffer underflow!
Now simply reboot.
With the Pi fully updated, we can configure the audio settings.
Open a console and execute the following commands: sudo nano /boot/config.txt
You are now viewing the boot configuration file of the Raspberry Pi. You will see a lot of configuration lines in there with a # in front of them. These lines are commented out and thus not active. You can enable these configurations by simple removing the # sign.
Just make sure that you un-comment OR add the following lines to your config. Just make sure these lines are there and not commented out. dtparam=i2s=on
Now remove the following lines, or place a # in front them, if they exist. dtparam=audio=on
We’ve enabled audio through I2S (the pin headers), enabled the hifiberry-dacplus driver (which is the compatible driver for the PiFi) and enabled the IR module on the PiFi which is not available on the HiFiBerry.
We’ve disabled on-board audio and the ir-hat that we do not have.
Use Ctrl-X to exit and save (Y) the config.txt (ENTER) file.
Once in the console again we can type the following command: sudo nano /etc/asound.conf
and then type the following:
type hw card 0
type hw card 0
Use Ctrl-X to exit and save (Y) the asound.conf (ENTER) file.
Reboot your Pi and congratulate yourself with fully configured Raspberry Pi with PiFi DAC!
You do have two options. You can install the latest and greatest Mixxx 2 by building the application from source. They have a decent guideline on how to do that on their website. It does work, but for my use version 2 does not add any real value at all (cover art, FX, 2 extra decks), while it uses more processing resources. As my device is going to be used in a theater where stability and performance is much more important than the latest and greatest auto mixing features and cover art, I decided to go for Mixxx version 1.11.0 which is available in the default Rasbian repository. This version turns out to run very fast and smooth. I could play 8 songs simultaneously (using the samplers) at the same time without a single buffer underflow and the processor at around 35% usage, which in turn ensures it stays cool enough. So I recommend to install Mixxx 1.11.0 as follows.
Open a console and execute the following command while you answer “Y” on any questions. sudo apt-get install mixxx
With Mixxx now installed we need to do some configurations inside Mixxx.
Start Mixxx and goto: Options->Preferences
On the “Sound Hardware” tab select the “snd_rpi_hifiberry_dacplus:-(hw:0,0)” “Channels 1 – 2” for you Master Output
On the “Interface” tab select “HSV” as the “Display type” for your “Waveform Display”. “HSV” or “empty” are the only usable ones on a Raspberry Pi.
Every now and then I still fall for it. Whenever I’m trying to accomplish something I’ve never done before, I start a Google search to find some nice video’s or blog posts that explain how I can accomplish this specific kind of task. That in itself is perfectly fine, however… one should not stop using its own brain!
This week I wanted to add an Inductive Proximity Sensor (LJ12A3-4-Z/BX) to my 3D printer as touching the printer bed while measuring the distance towards the printer bed has an actual effect on the measurement.. duh. Especially when you have a round aluminium printer bed that has supports at three “corners” only.
Side note (1): The main reason I own a 3D printer is that I’m into electronics – I like to built and program my own IoT hardware – and wanted to be able to print my own custom cases.
So let me refer you to some contents on the internet that explain how to install this proximity sensor:
They all tell you to work with a voltage divider as these sensors are powered by 6V to 36V, which means that their signal wire can be at that level to. Most 3D printer control boards however are Atmega based, which have max input of 5.5V. My MKS Base V1.5 printer board, is indeed based on an Atmega 2560 and suffers that same limitation.
This all seemed very legit, so without thinking, I started to built a voltage divider, following their samples. I started out by combining 6.8kΩ and 4.7kΩ as this does stay within the standard range of “pull-up” values which is between 4.7kΩ and 10kΩ.
Tested my voltage divider with a 9 volts battery, and it all worked out fine. So let’s tear down my printer and add the proximity sensor. Installed the sensor together with the divider and… nothing! I then tested the voltage divider in combination with the sensor (don’t ask me why I didn’t test it with the sensor the first time) and noticed that the output, which should be around 5V, was around 2.5V only. OK, that might be an indication that the supplied current is not enough to maintain the “high” voltage when we are “pissing” away 2.5 mA towards Gnd. That is a bit weird as 2.5 mA is not that much, but let’s give it a try by using some higher value resistors. I don’t have the 15kΩ and 10kΩ mentioned in the video at hand so let’s take a 68kΩ and 47kΩ!
I was amazed as well, but indeed, this seemed to be the solution as the measured voltage now was 4.5V. Still to far off in my opinion, but it is high enough to pass as a logic high so let’s continue. Connect the sensor, configure the printer firmware and see what’s happening! Ehmm… nothing. Even though the sensor’s LED lights up when I approach it with something metal, the printer software still says NO.
Let’s take the digital multi meter at hand again and see what’s going on. We first measure the sensing pin on the printer board. I’m pretty sure I disabled the pull-up in the firmware so we should measure either a floating pin, or something close to GND.
Side note (2): In electronics we do not like floating pins. We either pull them softly, but fully, up towards Vdd or down to GND.
But wait! It reads a high 5V! That’s not good. Verified my firmware and the pull-up is indeed disabled, so did they add some hardware pull-ups?
Please tell me they didn’t. Because if they did add a standard hardware pull-up between 4.7kΩ and 10kΩ , I will indeed never be able to pull it down to LOW through the 68kΩ resistor in my voltage divider. OK, getting a bit tired of it but, never give up and search for the schematics on the printer board then.
You can find some sort of design of the board on GitHub, but that is not detailed enough. Luckily I found someone with the same issue that I had and he had a solution! Hurrah, all I needed to do was to remove some resisters from the printer board and then it will all work. So I prepared my soldering iron to attack my printer board and then……
NOOOOOH, of course not. It was just then when I finally decided to use my own brains. I should be able to solve this myself! Serious? I almost got medieval on the ass of my printer board with a soldering iron.
So let’s use our brain and look at the schematics of these type of sensors.
The sensor type I’ve got is NPN NO which means that you measure the BLACK line and:
when it is not sensing anything inductive nearby, it should be open and thus floating
when it is sensing anything inductive nearby, it will be connected to GND
Hmmm… floating. Remember when I said we don’t like floating pins in electronics? We would like to have either all or nothing. So in this case, the following will most probably be true:
when it is not sensing anything inductive nearby, it will be pulled up to Vdd
when it is sensing anything inductive nearby, it will be connected to GND
So let’s draw a logical design on how an NPN transistor with a pull-up would look like.
We should be able to measure that with a digital multi meter. Just measure the resistance between BLACK and BROWN. I did and guess what? I indeed measured an almost perfect standard pull-up value of 10kΩ.
But wait a second… that’s why our voltage divider gave such weird values! What we thought was this:
Actually was this:
And that’s why it all didn’t work. Once we started to create a voltage divider with insane values it started to work as the 10kΩ did not have that high of an impact any more.
We can now also answer the question of how we actually should connect our NPN sensor to our printer board. We do need a voltage divider, but one of the resistor values is already given. We can use the following formula to calculate the required value of the second resistor R2:
To be on the safe side we pick a standard value which is less so we end up with 6.8kΩ. Our final solution just looks like this:
Indeed, all we need to do is add a single 6.8kΩ resistor between BLACK and BLUE and all should work fine.
Once the single resistor was added, I verified all voltages with my digital multi meter and it all worked perfectly fine.
Don’t forget that you do need to change your firmware because we still need to invert our end stop. It is HIGH when not triggered and LOW when triggered.
const bool Z_MIN_ENDSTOP_INVERTING = true;
So after all I got it working in the easiest, cheapest and most logical way one can, simply by using my own brain.
The moral of this story is to never stop thinking yourself and to not blindly trust all stories on the internet. Use your brains!
That being said! Don’t just do as this posts says! First you have to verify which type of sensor you’ve got. If you have a NPN type of sensor, you should be able to measure the 10kΩ pull-up resistor between BROWN and BLACK. If you have a PNP type of sensor, you will most probably(I don’t own one) be able to measure the 10kΩ pull-down resistor between the BLACK and BLUE. In case you’ve got a PNP type of sensor, the very first voltage divider should indeed be used.
One thing is sure. IF you do connect your sensor to 12V (which you should as that is within the specs!) you should not go without any voltage regulation, even though many people suggest you should. It doesn’t matter which type of sensor, you should not connect them as is to your signal wire if the sensor is connected to 12V.
Boris had a perfect comment on using a diode instead. And, believe it or not but, using a 1N4148 diode was my first solution. So I did test using a diode and that also works perfectly fine, simply because the direction in which the 12V current would like to flow when the sensor is open will be blocked by the diode. The internal (or hardware) pull-up still pulls the Atmega’s sensor pin to HIGH however.
But as soon as the sensor is closed, the diode would allow the 5V current to flow in the opposite direction towards ground, which pulls the Atmega’s sensor pin to LOW.
So both the proper voltage divider and a diode can do the job. Which one you prefer… well, the diode might actually be safer to use (they often call it a protection diode with a reason ;-)) if installed correctly, but it also depends on what you have at hand and even what you prefer I guess. The reason I preferred to explain the voltage divider in the first place, is that one cannot wire the resistor in the wrong direction. If you do that on the diode, you will permanently damage your printer board.
While I was watching referrals to this blog post I noticed some Swedish(?) web site. When I looked at that blog post (after translation) it showed an ever better way of connecting the sensor to the printer board by using an opto coupler. I know a lot of people don’t have one of these lying around, but if you do… you can’t be any safer. Check it out here.
Some people were still struggling with the diode implementation, so I created a picture walk-through on how the diode method works. The walk-through can be downloaded over here.