Bird
0
0
Raspberry Piprogramming~20 mins

MCP3008 ADC over SPI in Raspberry Pi - Practice Problems & Coding Challenges

Choose your learning style9 modes available
Challenge - 5 Problems
🎖️
MCP3008 SPI Mastery
Get all challenges correct to earn this badge!
Test your skills under time pressure!
Predict Output
intermediate
2:00remaining
Reading MCP3008 Channel Output
What is the output of this Python code snippet that reads from channel 0 of the MCP3008 ADC using SPI on a Raspberry Pi?
Raspberry Pi
import spidev
spi = spidev.SpiDev()
spi.open(0, 0)
spi.max_speed_hz = 1350000

# Function to read channel 0
adc = spi.xfer2([1, (8 + 0) << 4, 0])
data = ((adc[1] & 3) << 8) + adc[2]
print(data)
AA runtime error due to incorrect SPI command format
BA list of three integers representing raw SPI bytes
CA string showing the SPI device name
DAn integer between 0 and 1023 representing the analog value on channel 0
Attempts:
2 left
💡 Hint
The MCP3008 returns a 10-bit value from 0 to 1023 for each channel read.
🧠 Conceptual
intermediate
1:30remaining
Understanding MCP3008 SPI Command Structure
Which part of the SPI command byte sequence selects the MCP3008 channel to read?
AThe second byte's bits 4 to 6 (shifted by 4) specify the channel number
BThe channel is selected by the SPI clock speed
CThe third byte contains the channel number
DThe first byte always selects the channel
Attempts:
2 left
💡 Hint
Look at how the channel number is shifted and combined in the command bytes.
🔧 Debug
advanced
2:30remaining
Fixing Incorrect MCP3008 SPI Read Output
This code attempts to read channel 3 from MCP3008 but always returns 0. What is the cause?
Raspberry Pi
import spidev
spi = spidev.SpiDev()
spi.open(0, 0)
spi.max_speed_hz = 1350000

adc = spi.xfer2([1, (3 << 4), 0])
data = ((adc[1] & 3) << 8) + adc[2]
print(data)
AThe channel number is not offset by 8 in the command byte, causing wrong channel selection
BThe SPI device is not opened correctly
CThe max_speed_hz is too high causing communication errors
DThe bitwise AND operation on adc[1] is incorrect
Attempts:
2 left
💡 Hint
Check how the channel number is combined with the start bit in the command byte.
📝 Syntax
advanced
1:30remaining
Identify Syntax Error in MCP3008 SPI Read Code
Which option contains a syntax error that prevents the MCP3008 SPI read code from running?
A
adc = spi.xfer2([1, (8 + 2) &lt;&lt; 4, 0])
data = ((adc[1] &amp; 3) &lt;&lt; 8) + adc[2]
print(data)
B
adc = spi.xfer2([1, (8 + 2) &lt;&lt; 4 0])
data = ((adc[1] &amp; 3) &lt;&lt; 8) + adc[2]
print(data)
C
)atad(tnirp
]2[cda + )8 &lt;&lt; )3 &amp; ]1[cda(( = atad
)]0 ,4 &lt;&lt; )2 + 8( ,1[(2refx.ips = cda
D
dc = spi.xfer2([1, (8 + 2) &lt;&lt; 4, 0])
data = ((adc[1] &amp; 3) &lt;&lt; 8) + adc[2]
print(data)
Attempts:
2 left
💡 Hint
Look carefully at the commas separating list elements.
🚀 Application
expert
2:00remaining
Calculate Voltage from MCP3008 ADC Reading
Given a 3.3V reference and a 10-bit MCP3008 ADC reading stored in variable data, which formula correctly converts data to voltage?
Avoltage = (data / 1023) * 5.0
Bvoltage = (data / 1024) * 3.3
Cvoltage = (data / 1023) * 3.3
Dvoltage = (data / 1024) * 5.0
Attempts:
2 left
💡 Hint
The MCP3008 outputs values from 0 to 1023 for 10 bits, and the reference voltage is 3.3V.