<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:media="http://search.yahoo.com/mrss/" xmlns:dc="http://purl.org/dc/elements/1.1/"><channel><title>Ajay Walia</title><link>https://curiousbit.netlify.app/</link><description>Digital workplace, artificial intelligence, cloud, security, automation, and enterprise technology notes by Ajay Walia.</description><language>en-au</language><managingEditor>Ajay Walia</managingEditor><webMaster>Ajay Walia</webMaster><copyright>Copyright 2026 Ajay Walia</copyright><lastBuildDate>Mon, 12 Oct 2026 05:42:57 +0000</lastBuildDate><atom:link href="https://curiousbit.netlify.app/tags/electronics/index.xml" rel="self" type="application/rss+xml"/><image><url>https://curiousbit.netlify.app/images/og-default.png</url><title>Ajay Walia</title><link>https://curiousbit.netlify.app/</link></image><item><title>Top 50 Raspberry Pi Projects (+8 Bonus Builds)</title><link>https://curiousbit.netlify.app/raspberry-pi-top-50-projects/</link><guid isPermaLink="true">https://curiousbit.netlify.app/raspberry-pi-top-50-projects/</guid><pubDate>Sun, 04 Oct 2026 08:00:00 +1100</pubDate><dc:creator>Ajay Walia</dc:creator><description>&lt;style&gt;#rpkb{--fg:#101418;--mut:#52525b;--line:#a1a1aa;--pn:rgba(127,127,127,.06);--bd:rgba(127,127,127,.24);--acc:#00a844;--wire:#334155;--warn:#b45309;--warnbg:rgba(245,158,11,.10);--danger:#b91c1c;--dangerbg:rgba(239,68,68,.08);color:inherit;}
.dark #rpkb{--fg:#f4f4f5;--mut:#a1a1aa;--line:#71717a;--wire:#cbd5e1;--acc:#00e676;--warn:#fbbf24;--danger:#f87171;}
#rpkb *{box-sizing:border-box;}
#rpkb p{margin:0 0 1rem;}
#rpkb p.rp-lead{font-size:1.08em;line-height:1.8;margin:0 0 1.4rem;}
#rpkb .rp-stats{display:grid;grid-template-columns:repeat(4,1fr);gap:12px;margin:0 0 1.6rem;}
@media(max-width:700px){#rpkb .rp-stats{grid-template-columns:repeat(2,1fr);}}
#rpkb .rp-stat{border:1px solid var(--bd);border-radius:14px;padding:14px 16px;background:var(--pn);}
#rpkb .rp-stat b{background:linear-gradient(90deg,#ff10f0,#00f0ff);-webkit-background-clip:text;background-clip:text;color:transparent;display:block;font-size:2rem;line-height:1;font-weight:900;font-family:'Bricolage Grotesque',Outfit,sans-serif;}
#rpkb .rp-stat span{font-size:.85rem;color:var(--mut);}
#rpkb .rp-how{border:1px solid var(--bd);border-radius:14px;padding:16px 20px;background:var(--pn);margin:0 0 1.2rem;}
#rpkb .rp-how ol,#rpkb .rp-cap ol{margin:.4rem 0 0;padding-left:1.4rem;list-style:decimal;}#rpkb .rp-cap ul{list-style:disc;padding-left:1.4rem;}
#rpkb .rp-how li{margin:.3rem 0;font-size:.95em;}
#rpkb .rp-kicker{font-size:.75rem;font-weight:900;letter-spacing:.08em;text-transform:uppercase;color:var(--acc);margin:0 0 .3rem;}
/* figures */
#rpkb .rp-fig{border:1px solid var(--bd);border-radius:16px;padding:18px 18px 14px;margin:1.2rem 0 1.6rem;background:var(--pn);}
#rpkb .rp-fig h4{margin:0 0 2px;font-size:1.15rem;font-weight:800;font-family:'Bricolage Grotesque',Outfit,sans-serif;}
#rpkb .rp-fig .rp-sub{font-size:.9rem;color:var(--mut);margin:0 0 12px;}
#rpkb .rp-fig svg{display:block;width:100%;height:auto;max-width:100%;overflow:visible;}
#rpkb .rp-cap,#rpkb .rp-cap p,#rpkb .rp-cap li,#rpkb .rp-fig p{font-size:.95rem;line-height:1.7;}#rpkb .rp-cap{margin:.8rem 0 0;}#rpkb .rp-cap p{margin:0 0 .7rem;}#rpkb .rp-fig.wide{grid-column:1/-1;}
#rpkb .rp-cap li{margin:.2rem 0;}
#rpkb .rp-ctrl{display:flex;flex-wrap:wrap;align-items:center;gap:8px;margin:10px 0 0;}
#rpkb .rp-ctrl label{font-size:.9rem;font-weight:700;}
#rpkb .rp-ctrl input[type=range]{flex:1;min-width:160px;accent-color:var(--acc);}
#rpkb .rp-out{font-family:ui-monospace,SFMono-Regular,Menlo,monospace;font-size:.88rem;padding:6px 10px;border-radius:8px;background:rgba(127,127,127,.12);}
#rpkb .rp-btn{font:inherit;font-size:.88rem;font-weight:800;border:1px solid var(--bd);background:transparent;color:inherit;padding:7px 14px;border-radius:999px;cursor:pointer;transition:.15s;}
#rpkb .rp-btn:hover{border-color:var(--acc);}
#rpkb .rp-btn.on{background:var(--acc);border-color:var(--acc);color:#04130a;}
/* svg tokens */
#rpkb .t{fill:var(--fg);font-family:Outfit,ui-sans-serif,sans-serif;}
#rpkb .tm{fill:var(--mut);font-family:Outfit,ui-sans-serif,sans-serif;}
#rpkb .mono{font-family:ui-monospace,SFMono-Regular,Menlo,monospace;}
#rpkb .ln{stroke:var(--line);fill:none;}
#rpkb .wr{stroke:var(--wire);fill:none;}
#rpkb .pn{fill:var(--pn);stroke:var(--bd);}
#rpkb .bx{fill:rgba(127,127,127,.10);stroke:var(--line);}
#rpkb .acc{fill:var(--acc);} #rpkb .sacc{stroke:var(--acc);}
#rpkb .flow{stroke-dasharray:6 8;animation:rp-dash 1s linear infinite;}
@keyframes rp-dash{to{stroke-dashoffset:-28;}}
/* build flow */
#rpkb .bf-node circle.ring{fill:rgba(127,127,127,.08);stroke:var(--line);stroke-width:2;}
#rpkb .bf-node circle.hl{fill:none;stroke:var(--acc);stroke-width:5;opacity:0;animation:rp-hl 6s infinite;}
@keyframes rp-hl{0%,2%{opacity:0;}4%,15%{opacity:1;}18%,100%{opacity:0;}}
/* safety */
#rpkb .rp-safe{display:grid;gap:10px;margin:0 0 1.4rem;}
#rpkb .rp-w{border-left:5px solid var(--danger);background:var(--dangerbg);border-radius:10px;padding:12px 16px;font-size:.95em;}
#rpkb .rp-c{border-left:5px solid var(--warn);background:var(--warnbg);border-radius:10px;padding:12px 16px;font-size:.95em;}
#rpkb .rp-w b,#rpkb .rp-c b{display:block;font-size:.78rem;letter-spacing:.1em;}
#rpkb .rp-w b{color:var(--danger);} #rpkb .rp-c b{color:var(--warn);}
/* paths */
#rpkb .rp-paths{display:grid;grid-template-columns:repeat(auto-fill,minmax(280px,1fr));gap:14px;margin:0 0 1.4rem;}
#rpkb .rp-path{border:1px solid var(--bd);border-radius:16px;padding:16px 18px;background:var(--pn);position:relative;overflow:hidden;display:flex;flex-direction:column;align-items:flex-start;}#rpkb .rp-path .rp-btn{margin-top:auto;}
#rpkb .rp-path:before{content:"";position:absolute;inset:0 auto 0 0;width:5px;background:var(--pc);}
#rpkb .rp-path h4{margin:0;font-size:1.1rem;font-weight:800;}
#rpkb .rp-path p{font-size:.88rem;color:var(--mut);margin:.2rem 0 .7rem;}
#rpkb .rp-path ol{list-style:none;margin:0 0 .8rem;padding:0;counter-reset:s;}
#rpkb .rp-path li{counter-increment:s;display:flex;gap:9px;align-items:flex-start;font-size:.9rem;line-height:1.4;margin:.38rem 0;}
#rpkb .rp-path li:before{content:counter(s);flex:0 0 22px;height:22px;border-radius:50%;background:var(--pc);color:#05010a;box-shadow:0 0 10px -2px var(--pc);font-size:.72rem;font-weight:900;display:grid;place-items:center;}
#rpkb .rp-path a{color:inherit;text-decoration:none;border-bottom:1px dashed var(--line);}
#rpkb .rp-path a:hover{border-bottom-color:var(--pc);}
/* filter bar */
#rpkb .rp-bar{position:sticky;top:72px;z-index:20;border:1px solid var(--bd);border-radius:16px;padding:12px 14px;margin:0 0 1.2rem;background:rgba(248,249,250,.88);backdrop-filter:blur(14px);-webkit-backdrop-filter:blur(14px);}
.dark #rpkb .rp-bar{background:rgba(18,23,31,.88);}
#rpkb .rp-row{display:flex;flex-wrap:wrap;gap:8px;align-items:center;}
#rpkb .rp-row + .rp-row{margin-top:8px;}
#rpkb .rp-search{flex:1 1 220px;font:inherit;font-size:.95rem;padding:8px 14px;border-radius:999px;border:1px solid var(--bd);background:transparent;color:inherit;}
#rpkb .rp-search:focus{outline:2px solid var(--acc);outline-offset:1px;}
#rpkb .rp-sel{font:inherit;font-size:.88rem;padding:7px 10px;border-radius:999px;border:1px solid var(--bd);background:transparent;color:inherit;}
#rpkb .rp-sel option{color:#101418;}
#rpkb .rp-count{font-size:.85rem;color:var(--mut);margin-left:auto;font-weight:700;}
#rpkb .rp-pathnote{display:none;font-size:.85rem;margin-top:8px;}
#rpkb .rp-pathnote.on{display:block;}
/* groups and cards */
#rpkb .rp-gintro{font-size:.98em;color:var(--mut);margin:-.2rem 0 1rem;}
#rpkb .rp-grid{display:grid;grid-template-columns:repeat(auto-fill,minmax(290px,1fr));gap:18px;margin:0 0 2rem;}
#rpkb .rp-card{display:flex;flex-direction:column;border:1px solid var(--bd);border-radius:16px;overflow:hidden;background:var(--pn);transition:transform .18s,box-shadow .18s,border-color .18s;}
#rpkb .rp-card:hover{transform:translateY(-3px);border-color:var(--gc);box-shadow:0 0 0 1px var(--gc),0 12px 34px -12px var(--gc);}
#rpkb .rp-card.hide{display:none;}
#rpkb .rp-card.pulse{animation:rp-pulse 1.6s ease;}
@keyframes rp-pulse{0%,100%{box-shadow:none;}30%{box-shadow:0 0 0 4px var(--gc);}}
#rpkb .rp-art{position:relative;aspect-ratio:3/2;background:#0b1020;}
#rpkb .rp-art img{width:100%;height:100%;object-fit:cover;display:block;margin:0;border-radius:0;box-shadow:none;}
#rpkb .rp-num{position:absolute;top:10px;left:10px;font-size:.8rem;font-weight:900;background:rgba(0,0,0,.55);color:#fff;padding:3px 9px;border-radius:999px;}
#rpkb .rp-arch{position:absolute;top:10px;right:10px;font-size:.7rem;font-weight:900;background:#fde68a;color:#422006;padding:3px 9px;border-radius:999px;text-transform:uppercase;letter-spacing:.04em;}
#rpkb .rp-body{padding:14px 16px 16px;display:flex;flex-direction:column;flex:1;}
#rpkb .rp-tags{display:flex;flex-wrap:wrap;gap:6px;margin:0 0 8px;}
#rpkb .rp-tag{font-size:.7rem;font-weight:800;text-transform:uppercase;letter-spacing:.04em;padding:3px 9px;border-radius:999px;border:1px solid var(--bd);}
#rpkb .lv1{color:#15803d;background:rgba(34,197,94,.12);border-color:rgba(34,197,94,.4);}
#rpkb .lv2{color:#b45309;background:rgba(245,158,11,.13);border-color:rgba(245,158,11,.45);}
#rpkb .lv3{color:#b91c1c;background:rgba(239,68,68,.11);border-color:rgba(239,68,68,.4);}
.dark #rpkb .lv1{color:#4ade80;} .dark #rpkb .lv2{color:#fbbf24;} .dark #rpkb .lv3{color:#f87171;}
#rpkb .rp-card h5{margin:0 0 6px;font-size:1.08rem;line-height:1.3;font-weight:800;font-family:'Bricolage Grotesque',Outfit,sans-serif;}
#rpkb .rp-card .rp-s{font-size:.92rem;line-height:1.65;margin:0 0 10px;}
#rpkb .rp-learn{font-size:.82rem;color:var(--mut);margin:0 0 10px;}
#rpkb .rp-learn b{color:inherit;}
#rpkb details.rp-parts{font-size:.85rem;margin:0 0 12px;border-top:1px dashed var(--bd);padding-top:8px;}
#rpkb details.rp-parts summary{cursor:pointer;font-weight:800;}
#rpkb details.rp-parts p{margin:.4rem 0 0;line-height:1.6;}
#rpkb .rp-go{margin-top:auto;display:flex;align-items:center;justify-content:space-between;gap:8px;}
#rpkb .rp-go a{white-space:nowrap;font-size:.9rem;font-weight:800;color:inherit;text-decoration:none;border:1px solid var(--gc);padding:6px 12px;border-radius:999px;}
#rpkb .rp-go a:hover{background:var(--gc);color:#05010a;box-shadow:0 0 14px -2px var(--gc);}
html:not(.dark) #rpkb .rp-go a{border-color:color-mix(in srgb,var(--gc) 70%,#000);}
#rpkb .rp-src{font-size:.72rem;color:var(--mut);}
#rpkb .rp-empty{display:none;text-align:center;padding:30px;border:1px dashed var(--bd);border-radius:16px;margin:0 0 2rem;}
#rpkb .rp-empty.on{display:block;}
/* tables */
#rpkb .rp-tw{overflow-x:auto;border:1px solid var(--bd);border-radius:14px;margin:0 0 1.4rem;}
#rpkb table.rp-t{width:100%;border-collapse:collapse;font-size:.92rem;margin:0;}
#rpkb table.rp-t th,#rpkb table.rp-t td{padding:10px 12px;border-bottom:1px solid var(--bd);text-align:left;vertical-align:top;}
#rpkb table.rp-t th{font-size:.75rem;text-transform:uppercase;letter-spacing:.06em;color:var(--mut);background:var(--pn);}
#rpkb table.rp-t tr:last-child td{border-bottom:0;}
#rpkb .rp-barc{height:9px;border-radius:5px;background:var(--acc);min-width:4px;}
#rpkb .rp-kit{font-size:.7rem;font-weight:900;color:#04130a;background:var(--acc);padding:2px 8px;border-radius:999px;white-space:nowrap;}
/* gpio pin map */
#rpkb .pin{cursor:pointer;transition:transform .12s;transform-box:fill-box;transform-origin:center;}
#rpkb .pin:hover,#rpkb .pin.sel{transform:scale(1.25);}
#rpkb .pin.sel circle{stroke:var(--fg);stroke-width:3;}
#rpkb .pin.dim{opacity:.25;}
#rpkb .rp-legend{display:flex;flex-wrap:wrap;gap:8px 14px;font-size:.82rem;margin:10px 0 0;}
#rpkb .rp-legend span{display:inline-flex;align-items:center;gap:6px;cursor:pointer;}
#rpkb .rp-legend i{width:12px;height:12px;border-radius:50%;display:inline-block;}
#rpkb .rp-info{margin-top:10px;padding:10px 14px;border-radius:10px;border:1px solid var(--bd);font-size:.92rem;min-height:3.2em;}
@media(max-width:899px){#rpkb .rp-bar{position:static;}#rpkb .rp-fig{padding:14px 12px 10px;}#rpkb table.rp-t{font-size:.82rem;}#rpkb table.rp-t th,#rpkb table.rp-t td{padding:8px;}}
@media (prefers-reduced-motion: reduce){#rpkb *{animation:none!important;transition:none!important;}}
#rpkb .rp-fig.neon{border-color:color-mix(in srgb,var(--neon) 45%,transparent);box-shadow:0 0 0 1px color-mix(in srgb,var(--neon) 20%,transparent),0 14px 40px -22px var(--neon);}
#rpkb .rp-fig.neon h4{background:linear-gradient(90deg,var(--neon),var(--neon2));-webkit-background-clip:text;background-clip:text;color:transparent;}
.dark #rpkb .rp-fig.neon h4{filter:drop-shadow(0 0 8px color-mix(in srgb,var(--neon) 55%,transparent));}
html:not(.dark) #rpkb .rp-fig.neon h4{background:none;color:inherit;-webkit-background-clip:initial;background-clip:initial;border-left:5px solid var(--neon);padding-left:10px;}
#rpkb .rp-stage{position:relative;border-radius:14px;padding:14px 12px;background:var(--sbg);overflow:hidden;
box-shadow:inset 0 0 0 1px color-mix(in srgb,var(--neon) 40%,transparent),inset 0 0 40px -10px color-mix(in srgb,var(--neon) 45%,transparent);
--fg:var(--sfg,#f5f3ff);--line:rgba(255,255,255,.5);--wire:rgba(235,235,255,.75);--acc:var(--neon);--pn:rgba(255,255,255,.04);--bd:rgba(255,255,255,.22);}
#rpkb .rp-stage .t{fill:#f7f5ff;} #rpkb .rp-stage .tm{fill:rgba(235,235,255,.74);}
#rpkb .rp-stage .bx{fill:rgba(255,255,255,.06);stroke:var(--neon2);}
#rpkb .rp-stage .pn{fill:rgba(255,255,255,.04);stroke:rgba(255,255,255,.25);}
#rpkb .rp-stage .flow{filter:none;}
#rpkb .rp-badge{position:absolute;right:10px;top:8px;font-size:.62rem;font-weight:900;letter-spacing:.12em;text-transform:uppercase;color:var(--neon);opacity:.85;font-family:ui-monospace,Menlo,monospace;text-shadow:0 0 8px var(--neon);}
#rpkb .rp-fig.neon .rp-btn{border-color:color-mix(in srgb,var(--neon) 55%,transparent);}
#rpkb .rp-fig.neon .rp-btn:hover{border-color:var(--neon);box-shadow:0 0 12px -2px var(--neon);}
#rpkb .rp-fig.neon .rp-btn.on{background:var(--neon);border-color:var(--neon);color:#05010a;box-shadow:0 0 16px -2px var(--neon);}
#rpkb .rp-fig.neon input[type=range]{accent-color:var(--neon);}
#rpkb .rp-fig.neon .rp-out{border:1px solid color-mix(in srgb,var(--neon) 45%,transparent);}
#rpkb .rp-fig.neon .rp-info{border-color:color-mix(in srgb,var(--neon) 45%,transparent);}
#rpkb .rp-fig.neon .bf-node circle.hl{stroke:var(--neon2);}
#rpkb .rp-fig.neon .pin.sel circle{stroke:#fff;}
#rpkb .rp-cgrid{display:grid;grid-template-columns:repeat(auto-fill,minmax(min(100%,520px),1fr));gap:0 20px;}
#rpkb .rp-cgrid .rp-fig{margin:.6rem 0 1.4rem;}
#rpkb .rp-concepts{margin:0 0 .6rem;}&lt;/style&gt;
&lt;div id="rpkb"&gt;
&lt;div class="not-prose rp-wrap"&gt;&lt;div class="rp-hero" style="border-radius:16px;overflow:hidden;border:1px solid var(--bd);margin:0 0 1.4rem;aspect-ratio:16/9;background:#05070d"&gt;&lt;img src="https://curiousbit.netlify.app/images/raspberry-pi-top-50/hero.svg" alt="A Raspberry Pi board with wires to an LED, a camera, a Pico, a Sense HAT, a handheld console, a distance sensor, and a buzzer" width="1600" height="900" style="width:100%;height:100%;display:block;margin:0;border-radius:0;box-shadow:none"&gt;&lt;/div&gt;&lt;p class="rp-lead"&gt;A Raspberry Pi is a small, low-cost computer. With a few parts, it can become a robot, a camera trap, a game console, or a web server. This guide collects 50 free projects from the official Raspberry Pi sites, plus 8 popular builds for adults. Each card gives a short summary, the parts list, and a link to the full guide. The diagrams explain the main ideas before you build.&lt;/p&gt;</description><content:encoded>&lt;![CDATA[<img src="https://curiousbit.netlify.app/images/raspberry-pi-top-50/hero-v2.png" alt="Electronics" style="max-width:100%;height:auto;margin-bottom:1.5em;"/><style>#rpkb{--fg:#101418;--mut:#52525b;--line:#a1a1aa;--pn:rgba(127,127,127,.06);--bd:rgba(127,127,127,.24);--acc:#00a844;--wire:#334155;--warn:#b45309;--warnbg:rgba(245,158,11,.10);--danger:#b91c1c;--dangerbg:rgba(239,68,68,.08);color:inherit;}
.dark #rpkb{--fg:#f4f4f5;--mut:#a1a1aa;--line:#71717a;--wire:#cbd5e1;--acc:#00e676;--warn:#fbbf24;--danger:#f87171;}
#rpkb *{box-sizing:border-box;}
#rpkb p{margin:0 0 1rem;}
#rpkb p.rp-lead{font-size:1.08em;line-height:1.8;margin:0 0 1.4rem;}
#rpkb .rp-stats{display:grid;grid-template-columns:repeat(4,1fr);gap:12px;margin:0 0 1.6rem;}
@media(max-width:700px){#rpkb .rp-stats{grid-template-columns:repeat(2,1fr);}}
#rpkb .rp-stat{border:1px solid var(--bd);border-radius:14px;padding:14px 16px;background:var(--pn);}
#rpkb .rp-stat b{background:linear-gradient(90deg,#ff10f0,#00f0ff);-webkit-background-clip:text;background-clip:text;color:transparent;display:block;font-size:2rem;line-height:1;font-weight:900;font-family:'Bricolage Grotesque',Outfit,sans-serif;}
#rpkb .rp-stat span{font-size:.85rem;color:var(--mut);}
#rpkb .rp-how{border:1px solid var(--bd);border-radius:14px;padding:16px 20px;background:var(--pn);margin:0 0 1.2rem;}
#rpkb .rp-how ol,#rpkb .rp-cap ol{margin:.4rem 0 0;padding-left:1.4rem;list-style:decimal;}#rpkb .rp-cap ul{list-style:disc;padding-left:1.4rem;}
#rpkb .rp-how li{margin:.3rem 0;font-size:.95em;}
#rpkb .rp-kicker{font-size:.75rem;font-weight:900;letter-spacing:.08em;text-transform:uppercase;color:var(--acc);margin:0 0 .3rem;}
/* figures */
#rpkb .rp-fig{border:1px solid var(--bd);border-radius:16px;padding:18px 18px 14px;margin:1.2rem 0 1.6rem;background:var(--pn);}
#rpkb .rp-fig h4{margin:0 0 2px;font-size:1.15rem;font-weight:800;font-family:'Bricolage Grotesque',Outfit,sans-serif;}
#rpkb .rp-fig .rp-sub{font-size:.9rem;color:var(--mut);margin:0 0 12px;}
#rpkb .rp-fig svg{display:block;width:100%;height:auto;max-width:100%;overflow:visible;}
#rpkb .rp-cap,#rpkb .rp-cap p,#rpkb .rp-cap li,#rpkb .rp-fig p{font-size:.95rem;line-height:1.7;}#rpkb .rp-cap{margin:.8rem 0 0;}#rpkb .rp-cap p{margin:0 0 .7rem;}#rpkb .rp-fig.wide{grid-column:1/-1;}
#rpkb .rp-cap li{margin:.2rem 0;}
#rpkb .rp-ctrl{display:flex;flex-wrap:wrap;align-items:center;gap:8px;margin:10px 0 0;}
#rpkb .rp-ctrl label{font-size:.9rem;font-weight:700;}
#rpkb .rp-ctrl input[type=range]{flex:1;min-width:160px;accent-color:var(--acc);}
#rpkb .rp-out{font-family:ui-monospace,SFMono-Regular,Menlo,monospace;font-size:.88rem;padding:6px 10px;border-radius:8px;background:rgba(127,127,127,.12);}
#rpkb .rp-btn{font:inherit;font-size:.88rem;font-weight:800;border:1px solid var(--bd);background:transparent;color:inherit;padding:7px 14px;border-radius:999px;cursor:pointer;transition:.15s;}
#rpkb .rp-btn:hover{border-color:var(--acc);}
#rpkb .rp-btn.on{background:var(--acc);border-color:var(--acc);color:#04130a;}
/* svg tokens */
#rpkb .t{fill:var(--fg);font-family:Outfit,ui-sans-serif,sans-serif;}
#rpkb .tm{fill:var(--mut);font-family:Outfit,ui-sans-serif,sans-serif;}
#rpkb .mono{font-family:ui-monospace,SFMono-Regular,Menlo,monospace;}
#rpkb .ln{stroke:var(--line);fill:none;}
#rpkb .wr{stroke:var(--wire);fill:none;}
#rpkb .pn{fill:var(--pn);stroke:var(--bd);}
#rpkb .bx{fill:rgba(127,127,127,.10);stroke:var(--line);}
#rpkb .acc{fill:var(--acc);} #rpkb .sacc{stroke:var(--acc);}
#rpkb .flow{stroke-dasharray:6 8;animation:rp-dash 1s linear infinite;}
@keyframes rp-dash{to{stroke-dashoffset:-28;}}
/* build flow */
#rpkb .bf-node circle.ring{fill:rgba(127,127,127,.08);stroke:var(--line);stroke-width:2;}
#rpkb .bf-node circle.hl{fill:none;stroke:var(--acc);stroke-width:5;opacity:0;animation:rp-hl 6s infinite;}
@keyframes rp-hl{0%,2%{opacity:0;}4%,15%{opacity:1;}18%,100%{opacity:0;}}
/* safety */
#rpkb .rp-safe{display:grid;gap:10px;margin:0 0 1.4rem;}
#rpkb .rp-w{border-left:5px solid var(--danger);background:var(--dangerbg);border-radius:10px;padding:12px 16px;font-size:.95em;}
#rpkb .rp-c{border-left:5px solid var(--warn);background:var(--warnbg);border-radius:10px;padding:12px 16px;font-size:.95em;}
#rpkb .rp-w b,#rpkb .rp-c b{display:block;font-size:.78rem;letter-spacing:.1em;}
#rpkb .rp-w b{color:var(--danger);} #rpkb .rp-c b{color:var(--warn);}
/* paths */
#rpkb .rp-paths{display:grid;grid-template-columns:repeat(auto-fill,minmax(280px,1fr));gap:14px;margin:0 0 1.4rem;}
#rpkb .rp-path{border:1px solid var(--bd);border-radius:16px;padding:16px 18px;background:var(--pn);position:relative;overflow:hidden;display:flex;flex-direction:column;align-items:flex-start;}#rpkb .rp-path .rp-btn{margin-top:auto;}
#rpkb .rp-path:before{content:"";position:absolute;inset:0 auto 0 0;width:5px;background:var(--pc);}
#rpkb .rp-path h4{margin:0;font-size:1.1rem;font-weight:800;}
#rpkb .rp-path p{font-size:.88rem;color:var(--mut);margin:.2rem 0 .7rem;}
#rpkb .rp-path ol{list-style:none;margin:0 0 .8rem;padding:0;counter-reset:s;}
#rpkb .rp-path li{counter-increment:s;display:flex;gap:9px;align-items:flex-start;font-size:.9rem;line-height:1.4;margin:.38rem 0;}
#rpkb .rp-path li:before{content:counter(s);flex:0 0 22px;height:22px;border-radius:50%;background:var(--pc);color:#05010a;box-shadow:0 0 10px -2px var(--pc);font-size:.72rem;font-weight:900;display:grid;place-items:center;}
#rpkb .rp-path a{color:inherit;text-decoration:none;border-bottom:1px dashed var(--line);}
#rpkb .rp-path a:hover{border-bottom-color:var(--pc);}
/* filter bar */
#rpkb .rp-bar{position:sticky;top:72px;z-index:20;border:1px solid var(--bd);border-radius:16px;padding:12px 14px;margin:0 0 1.2rem;background:rgba(248,249,250,.88);backdrop-filter:blur(14px);-webkit-backdrop-filter:blur(14px);}
.dark #rpkb .rp-bar{background:rgba(18,23,31,.88);}
#rpkb .rp-row{display:flex;flex-wrap:wrap;gap:8px;align-items:center;}
#rpkb .rp-row + .rp-row{margin-top:8px;}
#rpkb .rp-search{flex:1 1 220px;font:inherit;font-size:.95rem;padding:8px 14px;border-radius:999px;border:1px solid var(--bd);background:transparent;color:inherit;}
#rpkb .rp-search:focus{outline:2px solid var(--acc);outline-offset:1px;}
#rpkb .rp-sel{font:inherit;font-size:.88rem;padding:7px 10px;border-radius:999px;border:1px solid var(--bd);background:transparent;color:inherit;}
#rpkb .rp-sel option{color:#101418;}
#rpkb .rp-count{font-size:.85rem;color:var(--mut);margin-left:auto;font-weight:700;}
#rpkb .rp-pathnote{display:none;font-size:.85rem;margin-top:8px;}
#rpkb .rp-pathnote.on{display:block;}
/* groups and cards */
#rpkb .rp-gintro{font-size:.98em;color:var(--mut);margin:-.2rem 0 1rem;}
#rpkb .rp-grid{display:grid;grid-template-columns:repeat(auto-fill,minmax(290px,1fr));gap:18px;margin:0 0 2rem;}
#rpkb .rp-card{display:flex;flex-direction:column;border:1px solid var(--bd);border-radius:16px;overflow:hidden;background:var(--pn);transition:transform .18s,box-shadow .18s,border-color .18s;}
#rpkb .rp-card:hover{transform:translateY(-3px);border-color:var(--gc);box-shadow:0 0 0 1px var(--gc),0 12px 34px -12px var(--gc);}
#rpkb .rp-card.hide{display:none;}
#rpkb .rp-card.pulse{animation:rp-pulse 1.6s ease;}
@keyframes rp-pulse{0%,100%{box-shadow:none;}30%{box-shadow:0 0 0 4px var(--gc);}}
#rpkb .rp-art{position:relative;aspect-ratio:3/2;background:#0b1020;}
#rpkb .rp-art img{width:100%;height:100%;object-fit:cover;display:block;margin:0;border-radius:0;box-shadow:none;}
#rpkb .rp-num{position:absolute;top:10px;left:10px;font-size:.8rem;font-weight:900;background:rgba(0,0,0,.55);color:#fff;padding:3px 9px;border-radius:999px;}
#rpkb .rp-arch{position:absolute;top:10px;right:10px;font-size:.7rem;font-weight:900;background:#fde68a;color:#422006;padding:3px 9px;border-radius:999px;text-transform:uppercase;letter-spacing:.04em;}
#rpkb .rp-body{padding:14px 16px 16px;display:flex;flex-direction:column;flex:1;}
#rpkb .rp-tags{display:flex;flex-wrap:wrap;gap:6px;margin:0 0 8px;}
#rpkb .rp-tag{font-size:.7rem;font-weight:800;text-transform:uppercase;letter-spacing:.04em;padding:3px 9px;border-radius:999px;border:1px solid var(--bd);}
#rpkb .lv1{color:#15803d;background:rgba(34,197,94,.12);border-color:rgba(34,197,94,.4);}
#rpkb .lv2{color:#b45309;background:rgba(245,158,11,.13);border-color:rgba(245,158,11,.45);}
#rpkb .lv3{color:#b91c1c;background:rgba(239,68,68,.11);border-color:rgba(239,68,68,.4);}
.dark #rpkb .lv1{color:#4ade80;} .dark #rpkb .lv2{color:#fbbf24;} .dark #rpkb .lv3{color:#f87171;}
#rpkb .rp-card h5{margin:0 0 6px;font-size:1.08rem;line-height:1.3;font-weight:800;font-family:'Bricolage Grotesque',Outfit,sans-serif;}
#rpkb .rp-card .rp-s{font-size:.92rem;line-height:1.65;margin:0 0 10px;}
#rpkb .rp-learn{font-size:.82rem;color:var(--mut);margin:0 0 10px;}
#rpkb .rp-learn b{color:inherit;}
#rpkb details.rp-parts{font-size:.85rem;margin:0 0 12px;border-top:1px dashed var(--bd);padding-top:8px;}
#rpkb details.rp-parts summary{cursor:pointer;font-weight:800;}
#rpkb details.rp-parts p{margin:.4rem 0 0;line-height:1.6;}
#rpkb .rp-go{margin-top:auto;display:flex;align-items:center;justify-content:space-between;gap:8px;}
#rpkb .rp-go a{white-space:nowrap;font-size:.9rem;font-weight:800;color:inherit;text-decoration:none;border:1px solid var(--gc);padding:6px 12px;border-radius:999px;}
#rpkb .rp-go a:hover{background:var(--gc);color:#05010a;box-shadow:0 0 14px -2px var(--gc);}
html:not(.dark) #rpkb .rp-go a{border-color:color-mix(in srgb,var(--gc) 70%,#000);}
#rpkb .rp-src{font-size:.72rem;color:var(--mut);}
#rpkb .rp-empty{display:none;text-align:center;padding:30px;border:1px dashed var(--bd);border-radius:16px;margin:0 0 2rem;}
#rpkb .rp-empty.on{display:block;}
/* tables */
#rpkb .rp-tw{overflow-x:auto;border:1px solid var(--bd);border-radius:14px;margin:0 0 1.4rem;}
#rpkb table.rp-t{width:100%;border-collapse:collapse;font-size:.92rem;margin:0;}
#rpkb table.rp-t th,#rpkb table.rp-t td{padding:10px 12px;border-bottom:1px solid var(--bd);text-align:left;vertical-align:top;}
#rpkb table.rp-t th{font-size:.75rem;text-transform:uppercase;letter-spacing:.06em;color:var(--mut);background:var(--pn);}
#rpkb table.rp-t tr:last-child td{border-bottom:0;}
#rpkb .rp-barc{height:9px;border-radius:5px;background:var(--acc);min-width:4px;}
#rpkb .rp-kit{font-size:.7rem;font-weight:900;color:#04130a;background:var(--acc);padding:2px 8px;border-radius:999px;white-space:nowrap;}
/* gpio pin map */
#rpkb .pin{cursor:pointer;transition:transform .12s;transform-box:fill-box;transform-origin:center;}
#rpkb .pin:hover,#rpkb .pin.sel{transform:scale(1.25);}
#rpkb .pin.sel circle{stroke:var(--fg);stroke-width:3;}
#rpkb .pin.dim{opacity:.25;}
#rpkb .rp-legend{display:flex;flex-wrap:wrap;gap:8px 14px;font-size:.82rem;margin:10px 0 0;}
#rpkb .rp-legend span{display:inline-flex;align-items:center;gap:6px;cursor:pointer;}
#rpkb .rp-legend i{width:12px;height:12px;border-radius:50%;display:inline-block;}
#rpkb .rp-info{margin-top:10px;padding:10px 14px;border-radius:10px;border:1px solid var(--bd);font-size:.92rem;min-height:3.2em;}
@media(max-width:899px){#rpkb .rp-bar{position:static;}#rpkb .rp-fig{padding:14px 12px 10px;}#rpkb table.rp-t{font-size:.82rem;}#rpkb table.rp-t th,#rpkb table.rp-t td{padding:8px;}}
@media (prefers-reduced-motion: reduce){#rpkb *{animation:none!important;transition:none!important;}}
#rpkb .rp-fig.neon{border-color:color-mix(in srgb,var(--neon) 45%,transparent);box-shadow:0 0 0 1px color-mix(in srgb,var(--neon) 20%,transparent),0 14px 40px -22px var(--neon);}
#rpkb .rp-fig.neon h4{background:linear-gradient(90deg,var(--neon),var(--neon2));-webkit-background-clip:text;background-clip:text;color:transparent;}
.dark #rpkb .rp-fig.neon h4{filter:drop-shadow(0 0 8px color-mix(in srgb,var(--neon) 55%,transparent));}
html:not(.dark) #rpkb .rp-fig.neon h4{background:none;color:inherit;-webkit-background-clip:initial;background-clip:initial;border-left:5px solid var(--neon);padding-left:10px;}
#rpkb .rp-stage{position:relative;border-radius:14px;padding:14px 12px;background:var(--sbg);overflow:hidden;
box-shadow:inset 0 0 0 1px color-mix(in srgb,var(--neon) 40%,transparent),inset 0 0 40px -10px color-mix(in srgb,var(--neon) 45%,transparent);
--fg:var(--sfg,#f5f3ff);--line:rgba(255,255,255,.5);--wire:rgba(235,235,255,.75);--acc:var(--neon);--pn:rgba(255,255,255,.04);--bd:rgba(255,255,255,.22);}
#rpkb .rp-stage .t{fill:#f7f5ff;} #rpkb .rp-stage .tm{fill:rgba(235,235,255,.74);}
#rpkb .rp-stage .bx{fill:rgba(255,255,255,.06);stroke:var(--neon2);}
#rpkb .rp-stage .pn{fill:rgba(255,255,255,.04);stroke:rgba(255,255,255,.25);}
#rpkb .rp-stage .flow{filter:none;}
#rpkb .rp-badge{position:absolute;right:10px;top:8px;font-size:.62rem;font-weight:900;letter-spacing:.12em;text-transform:uppercase;color:var(--neon);opacity:.85;font-family:ui-monospace,Menlo,monospace;text-shadow:0 0 8px var(--neon);}
#rpkb .rp-fig.neon .rp-btn{border-color:color-mix(in srgb,var(--neon) 55%,transparent);}
#rpkb .rp-fig.neon .rp-btn:hover{border-color:var(--neon);box-shadow:0 0 12px -2px var(--neon);}
#rpkb .rp-fig.neon .rp-btn.on{background:var(--neon);border-color:var(--neon);color:#05010a;box-shadow:0 0 16px -2px var(--neon);}
#rpkb .rp-fig.neon input[type=range]{accent-color:var(--neon);}
#rpkb .rp-fig.neon .rp-out{border:1px solid color-mix(in srgb,var(--neon) 45%,transparent);}
#rpkb .rp-fig.neon .rp-info{border-color:color-mix(in srgb,var(--neon) 45%,transparent);}
#rpkb .rp-fig.neon .bf-node circle.hl{stroke:var(--neon2);}
#rpkb .rp-fig.neon .pin.sel circle{stroke:#fff;}
#rpkb .rp-cgrid{display:grid;grid-template-columns:repeat(auto-fill,minmax(min(100%,520px),1fr));gap:0 20px;}
#rpkb .rp-cgrid .rp-fig{margin:.6rem 0 1.4rem;}
#rpkb .rp-concepts{margin:0 0 .6rem;}</style><div id="rpkb"><div class="not-prose rp-wrap"><div class="rp-hero" style="border-radius:16px;overflow:hidden;border:1px solid var(--bd);margin:0 0 1.4rem;aspect-ratio:16/9;background:#05070d"><img src="/images/raspberry-pi-top-50/hero.svg" alt="A Raspberry Pi board with wires to an LED, a camera, a Pico, a Sense HAT, a handheld console, a distance sensor, and a buzzer" width="1600" height="900" style="width:100%;height:100%;display:block;margin:0;border-radius:0;box-shadow:none"/><p class="rp-lead">A Raspberry Pi is a small, low-cost computer. With a few parts, it can become a robot, a camera trap, a game console, or a web server. This guide collects 50 free projects from the official Raspberry Pi sites, plus 8 popular builds for adults. Each card gives a short summary, the parts list, and a link to the full guide. The diagrams explain the main ideas before you build.</p><div class="rp-stats"><div class="rp-stat"><b>50</b><span>official projects</span></div><div class="rp-stat"><b>8</b><span>bonus builds</span></div><div class="rp-stat"><b>16</b><span>beginner projects</span></div><div class="rp-stat"><b>18</b><span>interactive diagrams</span></div></div><div class="rp-how"><p class="rp-kicker">How to use this page</p><ol><li>Read the build steps and the safety rules below.</li><li>Select a path, or use the filter bar to find a project for your level and your parts.</li><li>Read the "Learn the idea first" diagrams in that group.</li><li>Open the full guide from the card and build the project.</li></ol></div></div><h2 id="build">How a Pi project is built</h2><div class="not-prose rp-wrap"><figure style="--neon:#ff00e5;--neon2:#00f0ff;--sbg:linear-gradient(180deg,rgba(255,0,229,0) 55%,rgba(255,0,229,.35) 100%),repeating-linear-gradient(90deg,rgba(255,0,229,.22) 0 1px,transparent 1px 48px),linear-gradient(160deg,#1a0033 0%,#3d0066 55%,#0b0033 100%);" data-theme="Synthwave" class="rp-fig neon wide" id="fig-build"><h4>Six steps from an idea to a project that works</h4><p class="rp-sub">Most projects on this page use these six steps.</p><div class="rp-stage"><svg viewBox="0 -6 960 238" role="img" aria-label="Six steps: idea, parts, flash, wire, code, test"><defs><filter id="ng-fig-build" x="-10%" y="-10%" width="120%" height="120%"><feGaussianBlur in="SourceGraphic" stdDeviation="2.4" result="b"/><feMerge><feMergeNode in="b"/><feMergeNode in="SourceGraphic"/></feMerge></filter></defs><g filter="url(#ng-fig-build)"><defs><marker id="bfa" viewBox="0 0 10 10" refX="9" refY="5" markerWidth="7" markerHeight="7" orient="auto"><path d="M0 0 L10 5 L0 10 Z" fill="var(--line)"/></marker><marker id="bfb" viewBox="0 0 10 10" refX="9" refY="5" markerWidth="7" markerHeight="7" orient="auto"><path d="M0 0 L10 5 L0 10 Z" fill="var(--acc)"/></marker></defs><g class="bf-node" transform="translate(80 92)"><circle class="ring" r="44"/><circle class="hl" r="50" style="animation-delay:0s"/><path d="M-10 6 a14 14 0 1 1 20 0 v8 h-20 Z" fill="#fff01f"/><rect x="-8" y="16" width="16" height="5" rx="2" class="acc"/><text y="76" text-anchor="middle" font-size="19" font-weight="800" class="t">1. Idea</text><text y="98" text-anchor="middle" font-size="14" class="tm">Select a project</text></g><path d="M132 92 H186" class="ln" stroke-width="2.5" marker-end="url(#bfa)"/><g class="bf-node" transform="translate(240 92)"><circle class="ring" r="44"/><circle class="hl" r="50" style="animation-delay:1s"/><path d="M-24 0 h10 l4 -8 l6 16 l6 -16 l6 16 l4 -8 h12" stroke="#ff9e00" stroke-width="4" fill="none" stroke-linejoin="round"/><text y="76" text-anchor="middle" font-size="19" font-weight="800" class="t">2. Parts</text><text y="98" text-anchor="middle" font-size="14" class="tm">Get the parts</text></g><path d="M292 92 H346" class="ln" stroke-width="2.5" marker-end="url(#bfa)"/><g class="bf-node" transform="translate(400 92)"><circle class="ring" r="44"/><circle class="hl" r="50" style="animation-delay:2s"/><path d="M-12 -18 h16 l8 8 v28 h-24 Z" fill="#5b2a86"/><rect x="-8" y="0" width="16" height="12" rx="2" fill="#ff2e63"/><text y="76" text-anchor="middle" font-size="19" font-weight="800" class="t">3. Flash</text><text y="98" text-anchor="middle" font-size="14" class="tm">Write the SD card</text></g><path d="M452 92 H506" class="ln" stroke-width="2.5" marker-end="url(#bfa)"/><g class="bf-node" transform="translate(560 92)"><circle class="ring" r="44"/><circle class="hl" r="50" style="animation-delay:3s"/><path d="M-22 10 C-10 -24 10 24 22 -10" stroke="#00f0ff" stroke-width="5" fill="none" stroke-linecap="round"/><text y="76" text-anchor="middle" font-size="19" font-weight="800" class="t">4. Wire</text><text y="98" text-anchor="middle" font-size="14" class="tm">Connect the circuit</text></g><path d="M612 92 H666" class="ln" stroke-width="2.5" marker-end="url(#bfa)"/><g class="bf-node" transform="translate(720 92)"><circle class="ring" r="44"/><circle class="hl" r="50" style="animation-delay:4s"/><text y="8" text-anchor="middle" font-size="24" font-weight="800" class="t mono">&lt;/&gt;</text><text y="76" text-anchor="middle" font-size="19" font-weight="800" class="t">5. Code</text><text y="98" text-anchor="middle" font-size="14" class="tm">Write the program</text></g><path d="M772 92 H826" class="ln" stroke-width="2.5" marker-end="url(#bfa)"/><g class="bf-node" transform="translate(880 92)"><circle class="ring" r="44"/><circle class="hl" r="50" style="animation-delay:5s"/><path d="M-14 0 l9 10 l19 -22" stroke="#39ff14" stroke-width="6" fill="none" stroke-linecap="round" stroke-linejoin="round"/><text y="76" text-anchor="middle" font-size="19" font-weight="800" class="t">6. Test</text><text y="98" text-anchor="middle" font-size="14" class="tm">Run it and fix it</text></g><path d="M872 44 C858 4 742 4 728 44" class="sacc" fill="none" stroke-width="2.5" stroke-dasharray="5 6" marker-end="url(#bfb)"/><text x="800" y="14" text-anchor="middle" font-size="13" class="tm">fix and test again</text></g></svg><span class="rp-badge">Synthwave</span></div><div class="rp-cap"><ol><li>Select a project from this page. Read the full guide first.</li><li>Collect all the parts before you start.</li><li>Write the operating system to a microSD card (Raspberry Pi), or install MicroPython (Pico).</li><li>Disconnect the power. Then connect the circuit.</li><li>Write the program.</li><li>Run the program. If it does not operate correctly, change the code and test again.</li></ol></div></figure></div><h2 id="safety">Before you start: safety</h2><div class="not-prose rp-wrap"><div class="rp-safe"><div class="rp-w"><b>WARNING</b>Do not connect a 5 V supply to a GPIO pin. The GPIO pins use 3.3 V logic. A higher voltage can cause permanent damage.</div><div class="rp-w"><b>WARNING</b>Do not point a laser at the eyes of a person or an animal.</div><div class="rp-w"><b>WARNING</b>Do not connect mains voltage to your projects. Use only low-voltage supplies, for example 5 V or 12 V.</div><div class="rp-c"><b>CAUTION</b>Disconnect the power before you change the wires. A wrong connection can cause a short circuit.</div><div class="rp-c"><b>CAUTION</b>Keep water away from the Pi and the power supply. In the touch-free tap, put the pump and the water below the electronics.</div><div class="rp-c"><b>CAUTION</b>Use the official power supply for your model. A weak supply can cause errors and damage to the SD card.</div></div></div><h2 id="paths">Learning paths</h2><div class="not-prose rp-wrap"><p>Do not know where to start? Select a path. Each path puts 5 or 6 projects in a good order. Select a project name to go to its card.</p><div class="rp-paths"><div class="rp-path" style="--pc:#39ff14"><h4>First weekend</h4><p>No solder and no special parts. Start here.</p><ol><li><a href="#p-raspberry-pi-setting-up" data-jump="raspberry-pi-setting-up">Setting up your Raspberry Pi</a></li><li><a href="#p-raspberry-pi-using" data-jump="raspberry-pi-using">Using your Raspberry Pi</a></li><li><a href="#p-pacman-terminal" data-jump="pacman-terminal">Pac-Man treasure hunt on the terminal</a></li><li><a href="#p-physical-computing-with-scratch" data-jump="physical-computing-with-scratch">Physical Computing with Scratch</a></li><li><a href="#p-santa-detector" data-jump="santa-detector">Santa detector</a></li><li><a href="#p-python-web-server-with-flask" data-jump="python-web-server-with-flask">Build a Python web server with Flask</a></li></ol><button class="rp-btn" data-path="0">Show only this path</button></div><div class="rp-path" style="--pc:#ff10f0"><h4>With kids</h4><p>Craft materials, sounds, and lights. Each build is fast.</p><ol><li><a href="#p-scratch-led-game" data-jump="scratch-led-game">Scratch LED game</a></li><li><a href="#p-rpi-wire-loop-game-scratch" data-jump="rpi-wire-loop-game-scratch">Wire loop game</a></li><li><a href="#p-ultrasonic-theremin" data-jump="ultrasonic-theremin">Ultrasonic theremin</a></li><li><a href="#p-whoopi-cushion" data-jump="whoopi-cushion">Whoopi cushion</a></li><li><a href="#p-led-firefly" data-jump="led-firefly">LED firefly</a></li><li><a href="#p-party-popper" data-jump="party-popper">Party popper</a></li></ol><button class="rp-btn" data-path="1">Show only this path</button></div><div class="rp-path" style="--pc:#ff6b00"><h4>Road to a robot</h4><p>Learn the pins, then build and upgrade one robot.</p><ol><li><a href="#p-physical-computing" data-jump="physical-computing">Physical Computing with Python</a></li><li><a href="#p-python-quick-reaction-game" data-jump="python-quick-reaction-game">Python quick reaction game</a></li><li><a href="#p-build-a-buggy" data-jump="build-a-buggy">Build a robot buggy</a></li><li><a href="#p-remote-control-buggy" data-jump="remote-control-buggy">Remotely control your buggy</a></li><li><a href="#p-rpi-python-line-following" data-jump="rpi-python-line-following">Build a line-following robot</a></li></ol><button class="rp-btn" data-path="2">Show only this path</button></div><div class="rp-path" style="--pc:#bc13fe"><h4>Pico only</h4><p>One low-cost board. You do not set up an operating system.</p><ol><li><a href="#p-getting-started-with-the-pico" data-jump="getting-started-with-the-pico">Getting started with Raspberry Pi Pico</a></li><li><a href="#p-led-firefly" data-jump="led-firefly">LED firefly</a></li><li><a href="#p-beating-heart" data-jump="beating-heart">Beating heart</a></li><li><a href="#p-sound-machine" data-jump="sound-machine">Sound machine</a></li><li><a href="#p-time-to-make" data-jump="time-to-make">Time to make</a></li><li><a href="#p-get-started-pico-w" data-jump="get-started-pico-w">Getting started with Raspberry Pi Pico W</a></li></ol><button class="rp-btn" data-path="3">Show only this path</button></div><div class="rp-path" style="--pc:#00f0ff"><h4>Camera and nature</h4><p>Photos, time-lapse, wildlife, and plant science.</p><ol><li><a href="#p-getting-started-with-picamera" data-jump="getting-started-with-picamera">Getting started with the Camera Module</a></li><li><a href="#p-parent-detector" data-jump="parent-detector">The parent detector</a></li><li><a href="#p-cress-egg-heads" data-jump="cress-egg-heads">Cress egg heads</a></li><li><a href="#p-push-button-stop-motion" data-jump="push-button-stop-motion">Push-button stop motion</a></li><li><a href="#p-infrared-bird-box" data-jump="infrared-bird-box">Infrared bird box</a></li><li><a href="#p-astropi-ndvi" data-jump="astropi-ndvi">Capture plant health with NDVI</a></li></ol><button class="rp-btn" data-path="4">Show only this path</button></div><div class="rp-path" style="--pc:#00ffc6"><h4>Home server</h4><p>Make the Pi a useful always-on box for your home.</p><ol><li><a href="#p-python-web-server-with-flask" data-jump="python-web-server-with-flask">Build a Python web server with Flask</a></li><li><a href="#p-lamp-web-server-with-wordpress" data-jump="lamp-web-server-with-wordpress">Build a LAMP web server with WordPress</a></li><li><a href="#p-pi-hole" data-jump="pi-hole">Pi-hole network ad blocker</a></li><li><a href="#p-pi-nas" data-jump="pi-nas">Home NAS with OpenMediaVault</a></li><li><a href="#p-home-assistant" data-jump="home-assistant">Home Assistant hub</a></li></ol><button class="rp-btn" data-path="5">Show only this path</button></div></div></div><h2 id="projects">The projects</h2><div class="not-prose rp-wrap"><div class="rp-bar" id="rp-bar" role="search"><div class="rp-row"><input class="rp-search" id="rp-q" type="search" placeholder="Search: camera, LED, robot, Scratch..." aria-label="Search the projects"><select class="rp-sel" id="rp-lv" aria-label="Level"><option value="">All levels</option><option value="1">Beginner</option><option value="2">Intermediate</option><option value="3">Advanced</option></select><select class="rp-sel" id="rp-b" aria-label="Board"><option value="">Pi and Pico</option><option value="pi">Raspberry Pi</option><option value="pico">Pico</option></select><select class="rp-sel" id="rp-g" aria-label="Group"><option value="">All groups</option><option value="start">Getting started</option><option value="gpio">GPIO and physical computing</option><option value="pico">Raspberry Pi Pico</option><option value="camera">Camera</option><option value="media">Media centre</option><option value="sensing">Home sensing</option><option value="robots">Robots</option><option value="games">Games and retro</option><option value="net">Networking</option><option value="sensehat">Sense HAT</option><option value="bonus">Beyond the basics</option></select></div><div class="rp-row"><button class="rp-btn" id="rp-x" aria-pressed="false">No extra parts</button><button class="rp-btn" id="rp-reset">Clear filters</button><span class="rp-count" id="rp-count"/></div><div class="rp-pathnote" id="rp-pathnote"/></div><div class="rp-empty" id="rp-empty">No project matches these filters. Select "Clear filters".</div></div><h3 id="grp-start">Getting started (4)</h3><div class="not-prose rp-wrap"><div class="rp-group" data-g="start"><p class="rp-gintro">Set up the board first. These four guides show the desktop, the settings, and remote access.</p><div class="rp-grid"><article class="rp-card" id="p-raspberry-pi-getting-started" style="--gc:#39ff14" data-lv="1" data-b="pi" data-g="start" data-x="1" data-s="getting started with raspberry pi connect the board to a screen, a keyboard, and a mouse. complete the first-boot questions. then use the desktop and the web browser. board ports first-boot setup desktop basics monitor and hdmi cable, usb keyboard and mouse, power supply, microsd card. headphones and an ethernet cable are optional. getting started"><div class="rp-art"><img src="/images/raspberry-pi-top-50/raspberry-pi-getting-started.svg" width="360" height="240" loading="lazy" decoding="async" alt="Illustration for Getting started with Raspberry Pi"><span class="rp-num">#1</span></div><div class="rp-body"><div class="rp-tags"><span class="rp-tag lv1">Beginner</span><span class="rp-tag">Raspberry Pi</span></div><h5>Getting started with Raspberry Pi</h5><p class="rp-s">Connect the board to a screen, a keyboard, and a mouse. Complete the first-boot questions. Then use the desktop and the web browser.</p><p class="rp-learn"><b>You learn:</b> Board ports, First-boot setup, Desktop basics</p><details class="rp-parts"><summary>Parts you need</summary><p>Monitor and HDMI cable, USB keyboard and mouse, power supply, microSD card. Headphones and an Ethernet cable are optional.</p></details><div class="rp-go"><a href="https://projects.raspberrypi.org/en/projects/raspberry-pi-getting-started" target="_blank" rel="noopener noreferrer">Open the guide ↗</a><span class="rp-src">Raspberry Pi Foundation projects</span></div></div></article><article class="rp-card" id="p-raspberry-pi-setting-up" style="--gc:#39ff14" data-lv="1" data-b="pi" data-g="start" data-x="1" data-s="setting up your raspberry pi select a model, a power supply, and storage. write the operating system to the sd card. start the pi with a screen or without a screen (headless). raspberry pi imager headless setup power needs the page helps you select power and storage. it does not give one fixed kit. getting started"><div class="rp-art"><img src="/images/raspberry-pi-top-50/raspberry-pi-setting-up.svg" width="360" height="240" loading="lazy" decoding="async" alt="Illustration for Setting up your Raspberry Pi"><span class="rp-num">#2</span></div><div class="rp-body"><div class="rp-tags"><span class="rp-tag lv1">Beginner</span><span class="rp-tag">Raspberry Pi</span></div><h5>Setting up your Raspberry Pi</h5><p class="rp-s">Select a model, a power supply, and storage. Write the operating system to the SD card. Start the Pi with a screen or without a screen (headless).</p><p class="rp-learn"><b>You learn:</b> Raspberry Pi Imager, Headless setup, Power needs</p><details class="rp-parts"><summary>Parts you need</summary><p>The page helps you select power and storage. It does not give one fixed kit.</p></details><div class="rp-go"><a href="https://projects.raspberrypi.org/en/projects/raspberry-pi-setting-up" target="_blank" rel="noopener noreferrer">Open the guide ↗</a><span class="rp-src">Raspberry Pi Foundation projects</span></div></div></article><article class="rp-card" id="p-raspberry-pi-using" style="--gc:#39ff14" data-lv="1" data-b="pi" data-g="start" data-x="0" data-s="using your raspberry pi change the desktop, keyboard, wi-fi, and sound settings. install new software and update the software that you have. system settings software updates none. you need a raspberry pi that you set up before. getting started"><div class="rp-art"><img src="/images/raspberry-pi-top-50/raspberry-pi-using.svg" width="360" height="240" loading="lazy" decoding="async" alt="Illustration for Using your Raspberry Pi"><span class="rp-num">#3</span></div><div class="rp-body"><div class="rp-tags"><span class="rp-tag lv1">Beginner</span><span class="rp-tag">Raspberry Pi</span><span class="rp-tag">No extra parts</span></div><h5>Using your Raspberry Pi</h5><p class="rp-s">Change the desktop, keyboard, Wi-Fi, and sound settings. Install new software and update the software that you have.</p><p class="rp-learn"><b>You learn:</b> System settings, Software updates</p><details class="rp-parts"><summary>Parts you need</summary><p>None. You need a Raspberry Pi that you set up before.</p></details><div class="rp-go"><a href="https://projects.raspberrypi.org/en/projects/raspberry-pi-using" target="_blank" rel="noopener noreferrer">Open the guide ↗</a><span class="rp-src">Raspberry Pi Foundation projects</span></div></div></article><article class="rp-card" id="p-raspberry-pi-connect" style="--gc:#39ff14" data-lv="1" data-b="pi" data-g="start" data-x="0" data-s="using raspberry pi connect use a web browser on a different computer to see and control the pi desktop. this also works when you are away from home. remote access screen share a second computer with a browser. the page names a raspberry pi 4, 5, or 400 with 64-bit raspberry pi os. getting started"><div class="rp-art"><img src="/images/raspberry-pi-top-50/raspberry-pi-connect.svg" width="360" height="240" loading="lazy" decoding="async" alt="Illustration for Using Raspberry Pi Connect"><span class="rp-num">#4</span></div><div class="rp-body"><div class="rp-tags"><span class="rp-tag lv1">Beginner</span><span class="rp-tag">Raspberry Pi</span><span class="rp-tag">No extra parts</span></div><h5>Using Raspberry Pi Connect</h5><p class="rp-s">Use a web browser on a different computer to see and control the Pi desktop. This also works when you are away from home.</p><p class="rp-learn"><b>You learn:</b> Remote access, Screen share</p><details class="rp-parts"><summary>Parts you need</summary><p>A second computer with a browser. The page names a Raspberry Pi 4, 5, or 400 with 64-bit Raspberry Pi OS.</p></details><div class="rp-go"><a href="https://projects.raspberrypi.org/en/projects/raspberry-pi-connect" target="_blank" rel="noopener noreferrer">Open the guide ↗</a><span class="rp-src">Raspberry Pi Foundation projects</span></div></div></article></div></div></div><h3 id="grp-gpio">GPIO and physical computing (11)</h3><div class="not-prose rp-wrap"><div class="rp-group" data-g="gpio"><p class="rp-gintro">These projects connect real parts to the pins of the Pi. A button gives an input. An LED or a buzzer is an output.</p><div class="rp-concepts" data-g="gpio"><p class="rp-kicker">Learn the idea first</p><div class="rp-cgrid"><figure style="--neon:#39ff14;--neon2:#fff01f;--sbg:radial-gradient(rgba(57,255,20,.16) 1px,transparent 1.5px) 0 0/18px 18px,radial-gradient(ellipse at 50% 40%,#003d22 0%,#000d07 75%);" data-theme="PCB glow" class="rp-fig neon wide" id="fig-gpio"><h4>The 40-pin GPIO header</h4><p class="rp-sub">Select a pin or a colour. The same layout is on the Raspberry Pi 2, 3, 4, 5, Zero, and 400.</p><div class="rp-stage"><svg viewBox="0 0 720 200" role="img" aria-label="The 40-pin GPIO header"><defs><filter id="ng-fig-gpio" x="-10%" y="-10%" width="120%" height="120%"><feGaussianBlur in="SourceGraphic" stdDeviation="2.4" result="b"/><feMerge><feMergeNode in="b"/><feMergeNode in="SourceGraphic"/></feMerge></filter></defs><g filter="url(#ng-fig-gpio)"><rect x="22" y="48" width="676" height="96" rx="10" fill="#0b5d3b" opacity=".9"/><rect x="30" y="54" width="660" height="84" rx="6" fill="#021a0e"/><g class="pin p3" data-n="1" data-v="3V3" tabindex="0" role="button" aria-label="Pin 1"><circle cx="48" cy="118" r="12" fill="#ff6b00"/><text x="48" y="122.5" text-anchor="middle" font-size="10" font-weight="800" fill="#fff" pointer-events="none">1</text></g><g class="pin p5" data-n="2" data-v="5V" tabindex="0" role="button" aria-label="Pin 2"><circle cx="48" cy="74" r="12" fill="#ff1f5a"/><text x="48" y="78.5" text-anchor="middle" font-size="10" font-weight="800" fill="#fff" pointer-events="none">2</text></g><g class="pin pio" data-n="3" data-v="2:I2C SDA" tabindex="0" role="button" aria-label="Pin 3"><circle cx="81" cy="118" r="12" fill="#39ff14"/><text x="81" y="122.5" text-anchor="middle" font-size="10" font-weight="800" fill="#fff" pointer-events="none">3</text></g><g class="pin p5" data-n="4" data-v="5V" tabindex="0" role="button" aria-label="Pin 4"><circle cx="81" cy="74" r="12" fill="#ff1f5a"/><text x="81" y="78.5" text-anchor="middle" font-size="10" font-weight="800" fill="#fff" pointer-events="none">4</text></g><g class="pin pio" data-n="5" data-v="3:I2C SCL" tabindex="0" role="button" aria-label="Pin 5"><circle cx="114" cy="118" r="12" fill="#39ff14"/><text x="114" y="122.5" text-anchor="middle" font-size="10" font-weight="800" fill="#fff" pointer-events="none">5</text></g><g class="pin pg" data-n="6" data-v="GND" tabindex="0" role="button" aria-label="Pin 6"><circle cx="114" cy="74" r="12" fill="#8c7bff"/><text x="114" y="78.5" text-anchor="middle" font-size="10" font-weight="800" fill="#fff" pointer-events="none">6</text></g><g class="pin pio" data-n="7" data-v="4" tabindex="0" role="button" aria-label="Pin 7"><circle cx="147" cy="118" r="12" fill="#39ff14"/><text x="147" y="122.5" text-anchor="middle" font-size="10" font-weight="800" fill="#fff" pointer-events="none">7</text></g><g class="pin pio" data-n="8" data-v="14:UART TX" tabindex="0" role="button" aria-label="Pin 8"><circle cx="147" cy="74" r="12" fill="#39ff14"/><text x="147" y="78.5" text-anchor="middle" font-size="10" font-weight="800" fill="#fff" pointer-events="none">8</text></g><g class="pin pg" data-n="9" data-v="GND" tabindex="0" role="button" aria-label="Pin 9"><circle cx="180" cy="118" r="12" fill="#8c7bff"/><text x="180" y="122.5" text-anchor="middle" font-size="10" font-weight="800" fill="#fff" pointer-events="none">9</text></g><g class="pin pio" data-n="10" data-v="15:UART RX" tabindex="0" role="button" aria-label="Pin 10"><circle cx="180" cy="74" r="12" fill="#39ff14"/><text x="180" y="78.5" text-anchor="middle" font-size="10" font-weight="800" fill="#fff" pointer-events="none">10</text></g><g class="pin pio" data-n="11" data-v="17" tabindex="0" role="button" aria-label="Pin 11"><circle cx="213" cy="118" r="12" fill="#39ff14"/><text x="213" y="122.5" text-anchor="middle" font-size="10" font-weight="800" fill="#fff" pointer-events="none">11</text></g><g class="pin pio" data-n="12" data-v="18:PWM" tabindex="0" role="button" aria-label="Pin 12"><circle cx="213" cy="74" r="12" fill="#39ff14"/><text x="213" y="78.5" text-anchor="middle" font-size="10" font-weight="800" fill="#fff" pointer-events="none">12</text></g><g class="pin pio" data-n="13" data-v="27" tabindex="0" role="button" aria-label="Pin 13"><circle cx="246" cy="118" r="12" fill="#39ff14"/><text x="246" y="122.5" text-anchor="middle" font-size="10" font-weight="800" fill="#fff" pointer-events="none">13</text></g><g class="pin pg" data-n="14" data-v="GND" tabindex="0" role="button" aria-label="Pin 14"><circle cx="246" cy="74" r="12" fill="#8c7bff"/><text x="246" y="78.5" text-anchor="middle" font-size="10" font-weight="800" fill="#fff" pointer-events="none">14</text></g><g class="pin pio" data-n="15" data-v="22" tabindex="0" role="button" aria-label="Pin 15"><circle cx="279" cy="118" r="12" fill="#39ff14"/><text x="279" y="122.5" text-anchor="middle" font-size="10" font-weight="800" fill="#fff" pointer-events="none">15</text></g><g class="pin pio" data-n="16" data-v="23" tabindex="0" role="button" aria-label="Pin 16"><circle cx="279" cy="74" r="12" fill="#39ff14"/><text x="279" y="78.5" text-anchor="middle" font-size="10" font-weight="800" fill="#fff" pointer-events="none">16</text></g><g class="pin p3" data-n="17" data-v="3V3" tabindex="0" role="button" aria-label="Pin 17"><circle cx="312" cy="118" r="12" fill="#ff6b00"/><text x="312" y="122.5" text-anchor="middle" font-size="10" font-weight="800" fill="#fff" pointer-events="none">17</text></g><g class="pin pio" data-n="18" data-v="24" tabindex="0" role="button" aria-label="Pin 18"><circle cx="312" cy="74" r="12" fill="#39ff14"/><text x="312" y="78.5" text-anchor="middle" font-size="10" font-weight="800" fill="#fff" pointer-events="none">18</text></g><g class="pin pio" data-n="19" data-v="10:SPI MOSI" tabindex="0" role="button" aria-label="Pin 19"><circle cx="345" cy="118" r="12" fill="#39ff14"/><text x="345" y="122.5" text-anchor="middle" font-size="10" font-weight="800" fill="#fff" pointer-events="none">19</text></g><g class="pin pg" data-n="20" data-v="GND" tabindex="0" role="button" aria-label="Pin 20"><circle cx="345" cy="74" r="12" fill="#8c7bff"/><text x="345" y="78.5" text-anchor="middle" font-size="10" font-weight="800" fill="#fff" pointer-events="none">20</text></g><g class="pin pio" data-n="21" data-v="9:SPI MISO" tabindex="0" role="button" aria-label="Pin 21"><circle cx="378" cy="118" r="12" fill="#39ff14"/><text x="378" y="122.5" text-anchor="middle" font-size="10" font-weight="800" fill="#fff" pointer-events="none">21</text></g><g class="pin pio" data-n="22" data-v="25" tabindex="0" role="button" aria-label="Pin 22"><circle cx="378" cy="74" r="12" fill="#39ff14"/><text x="378" y="78.5" text-anchor="middle" font-size="10" font-weight="800" fill="#fff" pointer-events="none">22</text></g><g class="pin pio" data-n="23" data-v="11:SPI SCLK" tabindex="0" role="button" aria-label="Pin 23"><circle cx="411" cy="118" r="12" fill="#39ff14"/><text x="411" y="122.5" text-anchor="middle" font-size="10" font-weight="800" fill="#fff" pointer-events="none">23</text></g><g class="pin pio" data-n="24" data-v="8:SPI CE0" tabindex="0" role="button" aria-label="Pin 24"><circle cx="411" cy="74" r="12" fill="#39ff14"/><text x="411" y="78.5" text-anchor="middle" font-size="10" font-weight="800" fill="#fff" pointer-events="none">24</text></g><g class="pin pg" data-n="25" data-v="GND" tabindex="0" role="button" aria-label="Pin 25"><circle cx="444" cy="118" r="12" fill="#8c7bff"/><text x="444" y="122.5" text-anchor="middle" font-size="10" font-weight="800" fill="#fff" pointer-events="none">25</text></g><g class="pin pio" data-n="26" data-v="7:SPI CE1" tabindex="0" role="button" aria-label="Pin 26"><circle cx="444" cy="74" r="12" fill="#39ff14"/><text x="444" y="78.5" text-anchor="middle" font-size="10" font-weight="800" fill="#fff" pointer-events="none">26</text></g><g class="pin pi" data-n="27" data-v="ID" tabindex="0" role="button" aria-label="Pin 27"><circle cx="477" cy="118" r="12" fill="#fff01f"/><text x="477" y="122.5" text-anchor="middle" font-size="10" font-weight="800" fill="#fff" pointer-events="none">27</text></g><g class="pin pi" data-n="28" data-v="ID" tabindex="0" role="button" aria-label="Pin 28"><circle cx="477" cy="74" r="12" fill="#fff01f"/><text x="477" y="78.5" text-anchor="middle" font-size="10" font-weight="800" fill="#fff" pointer-events="none">28</text></g><g class="pin pio" data-n="29" data-v="5" tabindex="0" role="button" aria-label="Pin 29"><circle cx="510" cy="118" r="12" fill="#39ff14"/><text x="510" y="122.5" text-anchor="middle" font-size="10" font-weight="800" fill="#fff" pointer-events="none">29</text></g><g class="pin pg" data-n="30" data-v="GND" tabindex="0" role="button" aria-label="Pin 30"><circle cx="510" cy="74" r="12" fill="#8c7bff"/><text x="510" y="78.5" text-anchor="middle" font-size="10" font-weight="800" fill="#fff" pointer-events="none">30</text></g><g class="pin pio" data-n="31" data-v="6" tabindex="0" role="button" aria-label="Pin 31"><circle cx="543" cy="118" r="12" fill="#39ff14"/><text x="543" y="122.5" text-anchor="middle" font-size="10" font-weight="800" fill="#fff" pointer-events="none">31</text></g><g class="pin pio" data-n="32" data-v="12:PWM" tabindex="0" role="button" aria-label="Pin 32"><circle cx="543" cy="74" r="12" fill="#39ff14"/><text x="543" y="78.5" text-anchor="middle" font-size="10" font-weight="800" fill="#fff" pointer-events="none">32</text></g><g class="pin pio" data-n="33" data-v="13:PWM" tabindex="0" role="button" aria-label="Pin 33"><circle cx="576" cy="118" r="12" fill="#39ff14"/><text x="576" y="122.5" text-anchor="middle" font-size="10" font-weight="800" fill="#fff" pointer-events="none">33</text></g><g class="pin pg" data-n="34" data-v="GND" tabindex="0" role="button" aria-label="Pin 34"><circle cx="576" cy="74" r="12" fill="#8c7bff"/><text x="576" y="78.5" text-anchor="middle" font-size="10" font-weight="800" fill="#fff" pointer-events="none">34</text></g><g class="pin pio" data-n="35" data-v="19:PWM" tabindex="0" role="button" aria-label="Pin 35"><circle cx="609" cy="118" r="12" fill="#39ff14"/><text x="609" y="122.5" text-anchor="middle" font-size="10" font-weight="800" fill="#fff" pointer-events="none">35</text></g><g class="pin pio" data-n="36" data-v="16" tabindex="0" role="button" aria-label="Pin 36"><circle cx="609" cy="74" r="12" fill="#39ff14"/><text x="609" y="78.5" text-anchor="middle" font-size="10" font-weight="800" fill="#fff" pointer-events="none">36</text></g><g class="pin pio" data-n="37" data-v="26" tabindex="0" role="button" aria-label="Pin 37"><circle cx="642" cy="118" r="12" fill="#39ff14"/><text x="642" y="122.5" text-anchor="middle" font-size="10" font-weight="800" fill="#fff" pointer-events="none">37</text></g><g class="pin pio" data-n="38" data-v="20" tabindex="0" role="button" aria-label="Pin 38"><circle cx="642" cy="74" r="12" fill="#39ff14"/><text x="642" y="78.5" text-anchor="middle" font-size="10" font-weight="800" fill="#fff" pointer-events="none">38</text></g><g class="pin pg" data-n="39" data-v="GND" tabindex="0" role="button" aria-label="Pin 39"><circle cx="675" cy="118" r="12" fill="#8c7bff"/><text x="675" y="122.5" text-anchor="middle" font-size="10" font-weight="800" fill="#fff" pointer-events="none">39</text></g><g class="pin pio" data-n="40" data-v="21" tabindex="0" role="button" aria-label="Pin 40"><circle cx="675" cy="74" r="12" fill="#39ff14"/><text x="675" y="78.5" text-anchor="middle" font-size="10" font-weight="800" fill="#fff" pointer-events="none">40</text></g><text x="48" y="172" font-size="13" class="tm">Pin 1 (square pad on the board)</text><text x="690" y="34" font-size="13" text-anchor="end" class="tm">Pin 40 is next to the USB ports</text><text x="30" y="34" font-size="13" class="tm">Even pins: top row</text><text x="690" y="172" font-size="13" text-anchor="end" class="tm">Odd pins: bottom row</text></g></svg><span class="rp-badge">PCB glow</span></div><div class="rp-legend"><span data-k="p3"><i style="background:#ff6b00"/>3.3 V power</span><span data-k="p5"><i style="background:#ff1f5a"/>5 V power</span><span data-k="pg"><i style="background:#8c7bff"/>Ground (0 V)</span><span data-k="pio"><i style="background:#39ff14"/>GPIO (3.3 V logic)</span><span data-k="pi"><i style="background:#fff01f"/>ID pins for HAT boards</span></div><div class="rp-info" id="gpio-info" aria-live="polite">Select a pin to see what it does.</div><div class="rp-cap"><p><b>Two numbers for each pin.</b> The<em>pin number</em> (1 to 40) is the physical position. The<em>GPIO number</em> is the name that your code uses. For example, pin 11 is GPIO 17. Python with GPIO Zero uses the GPIO number.</p><p class="rp-w" style="margin:0"><b>WARNING</b>Do not connect a 5 V pin to a GPIO pin. The GPIO pins use 3.3 V. 5 V can cause permanent damage to the Pi.</p></div></figure><figure style="--neon:#ff2e88;--neon2:#00e5ff;--sbg:repeating-linear-gradient(0deg,rgba(255,255,255,.04) 0 2px,transparent 2px 5px),radial-gradient(circle at 20% 30%,#5a0d7a 0%,#12001f 70%);" data-theme="Arcade" class="rp-fig neon" id="fig-ipo"><h4>Input, decide, output</h4><p class="rp-sub">Push the red button to send a signal through the program.</p><div class="rp-stage"><svg viewBox="0 0 720 230" role="img" aria-label="A button sends a signal to the Pi, and the Pi turns on an LED"><defs><filter id="ng-fig-ipo" x="-10%" y="-10%" width="120%" height="120%"><feGaussianBlur in="SourceGraphic" stdDeviation="2.4" result="b"/><feMerge><feMergeNode in="b"/><feMergeNode in="SourceGraphic"/></feMerge></filter></defs><g filter="url(#ng-fig-ipo)"><path id="ipo-a" d="M150 120 H285" class="wr" stroke-width="4"/><path id="ipo-b" d="M465 120 H585" class="wr" stroke-width="4"/><g id="ipo-btn" style="cursor:pointer" tabindex="0" role="button" aria-label="Push the button"><rect x="60" y="80" width="90" height="80" rx="10" fill="#2d1b4e"/><circle id="ipo-cap" cx="105" cy="120" r="26" fill="#ff2e88"/><text x="105" y="190" text-anchor="middle" font-size="17" font-weight="800" class="t">INPUT</text><text x="105" y="210" text-anchor="middle" font-size="13" class="tm">button (push me)</text></g><rect id="ipo-pi" x="285" y="70" width="180" height="100" rx="10" fill="#7a00ff"/><text x="375" y="104" text-anchor="middle" font-size="13" fill="#fff" class="mono">if button.is_pressed:</text><text x="375" y="126" text-anchor="middle" font-size="13" fill="#fff" class="mono">  led.on()</text><text x="375" y="152" text-anchor="middle" font-size="12" fill="#e0b3ff">Raspberry Pi</text><text x="375" y="190" text-anchor="middle" font-size="17" font-weight="800" class="t">DECIDE</text><text x="375" y="210" text-anchor="middle" font-size="13" class="tm">your program</text><circle id="ipo-glow" cx="625" cy="112" r="44" fill="#fff01f" opacity="0"/><path d="M607 135 V100 a18 18 0 0 1 36 0 V135 Z" fill="#fff01f" id="ipo-led" opacity=".35"/><rect x="603" y="132" width="44" height="7" rx="2" fill="#fff01f" opacity=".6"/><text x="625" y="190" text-anchor="middle" font-size="17" font-weight="800" class="t">OUTPUT</text><text x="625" y="210" text-anchor="middle" font-size="13" class="tm">LED</text><circle id="ipo-dot" r="8" fill="#00e5ff" opacity="0"/></g></svg><span class="rp-badge">Arcade</span></div><div class="rp-cap"><p>Nearly all physical projects use this loop. An<b>input</b> gives information to the Pi. The<b>program decides</b> what to do. An<b>output</b> does the action. In the Santa detector, the input is a PIR sensor and the output is an alarm sound.</p></div></figure><figure style="--neon:#00f0ff;--neon2:#ff10f0;--sbg:linear-gradient(rgba(0,240,255,.12) 1px,transparent 1px) 0 0/24px 24px,linear-gradient(90deg,rgba(0,240,255,.12) 1px,transparent 1px) 0 0/24px 24px,linear-gradient(135deg,#001a40,#000b24);" data-theme="Blueprint" class="rp-fig neon" id="fig-led"><h4>Why each LED needs a resistor</h4><p class="rp-sub">Select a resistor value. Watch the current and the brightness change.</p><div class="rp-stage"><svg viewBox="0 0 720 250" role="img" aria-label="A circuit from a GPIO pin through a resistor and an LED to ground"><defs><filter id="ng-fig-led" x="-10%" y="-10%" width="120%" height="120%"><feGaussianBlur in="SourceGraphic" stdDeviation="2.4" result="b"/><feMerge><feMergeNode in="b"/><feMergeNode in="SourceGraphic"/></feMerge></filter></defs><g filter="url(#ng-fig-led)"><path d="M140 70 H360" class="wr" stroke-width="4"/><path d="M440 70 H560 V110" class="wr" stroke-width="4"/><path d="M560 180 V200 H140" class="wr" stroke-width="4"/><path d="M140 70 H360 M440 70 H560 V110 M560 180 V200 H140" stroke="#00f0ff" stroke-width="4" fill="none" class="flow" id="led-flow"/><rect x="40" y="40" width="100" height="190" rx="10" fill="#004aad"/><text x="90" y="76" text-anchor="middle" font-size="14" fill="#fff" font-weight="800">GPIO 17</text><text x="90" y="94" text-anchor="middle" font-size="12" fill="#9fefff">3.3 V when on</text><text x="90" y="206" text-anchor="middle" font-size="14" fill="#fff" font-weight="800">GND</text><text x="90" y="222" text-anchor="middle" font-size="12" fill="#9fefff">0 V</text><rect x="360" y="56" width="80" height="28" rx="6" fill="#d6b98c" stroke="#92400e"/><rect x="376" y="56" width="6" height="28" fill="#f97316"/><rect x="390" y="56" width="6" height="28" fill="#f97316"/><rect x="404" y="56" width="6" height="28" fill="#92400e"/><rect x="424" y="56" width="5" height="28" fill="#eab308"/><text x="400" y="40" text-anchor="middle" font-size="15" font-weight="800" class="t" id="led-rl">330 Ω</text><text x="400" y="110" text-anchor="middle" font-size="13" class="tm">resistor</text><circle id="led-glow" cx="560" cy="140" r="50" fill="#ff10f0" opacity=".3"/><path d="M542 160 V128 a18 18 0 0 1 36 0 V160 Z" fill="#ff10f0"/><rect x="538" y="158" width="44" height="8" rx="2" fill="#ff10f0"/><text x="610" y="135" font-size="13" class="tm">LED</text><text x="610" y="152" font-size="13" class="tm">(about 2 V)</text><text x="330" y="232" text-anchor="middle" font-size="13" class="tm">current flows: pin → resistor → LED → ground</text></g></svg><span class="rp-badge">Blueprint</span></div><div class="rp-ctrl"><label>Resistor:</label><button class="rp-btn" data-r="220">220 Ω</button><button class="rp-btn on" data-r="330">330 Ω</button><button class="rp-btn" data-r="470">470 Ω</button><button class="rp-btn" data-r="1000">1000 Ω</button><span class="rp-out" id="led-out">I = (3.3 V − 2.0 V) ÷ 330 Ω ≈ 3.9 mA</span></div><div class="rp-cap"><p>An LED does not limit its own current. Without a resistor, too much current can flow. This can damage the LED or the pin. The resistor sets the current. A larger resistor gives less current and a dimmer light. The values here are approximate. The forward voltage of an LED changes with its colour.</p></div></figure><figure style="--neon:#00ffd5;--neon2:#fff01f;--sbg:repeating-radial-gradient(circle at 12% 50%,rgba(0,255,213,.12) 0 1px,transparent 1px 40px),radial-gradient(circle at 12% 50%,#00404a 0%,#00080d 75%);" data-theme="Sonar" class="rp-fig neon" id="fig-us"><h4>How an ultrasonic sensor measures distance</h4><p class="rp-sub">Move the slider. The echo time changes with the distance.</p><div class="rp-stage"><svg viewBox="0 0 720 210" role="img" aria-label="An ultrasonic sensor sends a pulse that reflects from a hand"><defs><filter id="ng-fig-us" x="-10%" y="-10%" width="120%" height="120%"><feGaussianBlur in="SourceGraphic" stdDeviation="2.4" result="b"/><feMerge><feMergeNode in="b"/><feMergeNode in="SourceGraphic"/></feMerge></filter></defs><g filter="url(#ng-fig-us)"><rect x="30" y="60" width="120" height="70" rx="6" fill="#0050ff"/><circle cx="62" cy="95" r="22" fill="#d6fff7"/><circle cx="62" cy="95" r="13" fill="#475569"/><circle cx="118" cy="95" r="22" fill="#d6fff7"/><circle cx="118" cy="95" r="13" fill="#475569"/><text x="62" y="152" text-anchor="middle" font-size="12" class="tm">trigger</text><text x="118" y="152" text-anchor="middle" font-size="12" class="tm">echo</text><g id="us-p"><path d="M0 -22 a30 30 0 0 1 0 44" stroke="#f8fafc" stroke-width="4" fill="none"/><path d="M0 -22 a30 30 0 0 1 0 44" stroke="#00ffd5" stroke-width="2" fill="none"/></g><g id="us-h"><path d="M0 40 V-6 a7 7 0 0 1 14 0 V-28 a7 7 0 0 1 14 0 V-6 a7 7 0 0 1 14 0 V40 Z" fill="#fff01f"/></g><line x1="150" y1="180" x2="150" y2="170" class="ln" stroke-width="2"/><line id="us-dl" x1="150" y1="175" x2="400" y2="175" class="ln" stroke-width="2"/><text id="us-dt" x="275" y="196" text-anchor="middle" font-size="13" class="t">30 cm</text></g></svg><span class="rp-badge">Sonar</span></div><div class="rp-ctrl"><label for="us-r">Hand distance</label><input id="us-r" type="range" min="5" max="100" value="30"><span class="rp-out" id="us-o">echo time ≈ 1.75 ms</span></div><div class="rp-cap"><p>The sensor sends a short ultrasonic pulse. The pulse reflects from your hand and comes back. The Pi measures the time. Sound moves at about 343 m/s. The pulse goes out and back, so divide by 2:</p><p class="rp-out" style="display:inline-block">distance = time × 343 m/s ÷ 2</p><p>The ultrasonic theremin changes this distance into a note. The touch-free tap uses it to start a pump.</p></div></figure></div></div><div class="rp-grid"><article class="rp-card" id="p-physical-computing" style="--gc:#ffb800" data-lv="2" data-b="pi" data-g="gpio" data-x="1" data-s="physical computing with python learn the gpio header with python. make leds come on, read buttons, and operate a buzzer, sensors, and a motor. gpio zero in python inputs and outputs analogue input with an mcp3008 breadboard, jumper wires, button, leds, resistors, buzzer, ultrasonic sensor, pir, ldr, capacitor, mcp3008, potentiometer, motor and motor controller, battery pack. gpio and physical computing"><div class="rp-art"><img src="/images/raspberry-pi-top-50/physical-computing.svg" width="360" height="240" loading="lazy" decoding="async" alt="Illustration for Physical Computing with Python"><span class="rp-num">#5</span></div><div class="rp-body"><div class="rp-tags"><span class="rp-tag lv2">Intermediate</span><span class="rp-tag">Raspberry Pi</span></div><h5>Physical Computing with Python</h5><p class="rp-s">Learn the GPIO header with Python. Make LEDs come on, read buttons, and operate a buzzer, sensors, and a motor.</p><p class="rp-learn"><b>You learn:</b> GPIO Zero in Python, Inputs and outputs, Analogue input with an MCP3008</p><details class="rp-parts"><summary>Parts you need</summary><p>Breadboard, jumper wires, button, LEDs, resistors, buzzer, ultrasonic sensor, PIR, LDR, capacitor, MCP3008, potentiometer, motor and motor controller, battery pack.</p></details><div class="rp-go"><a href="https://projects.raspberrypi.org/en/projects/physical-computing" target="_blank" rel="noopener noreferrer">Open the guide ↗</a><span class="rp-src">Raspberry Pi Foundation projects</span></div></div></article><article class="rp-card" id="p-physical-computing-with-scratch" style="--gc:#ffb800" data-lv="1" data-b="pi" data-g="gpio" data-x="1" data-s="physical computing with scratch use scratch blocks to control an led, a button, a buzzer, and a motion sensor. gpio in scratch event blocks led, resistor (47 to 330 ohm), button, buzzer, pir, jumper leads. the page names a raspberry pi 4. gpio and physical computing"><div class="rp-art"><img src="/images/raspberry-pi-top-50/physical-computing-with-scratch.svg" width="360" height="240" loading="lazy" decoding="async" alt="Illustration for Physical Computing with Scratch"><span class="rp-num">#6</span></div><div class="rp-body"><div class="rp-tags"><span class="rp-tag lv1">Beginner</span><span class="rp-tag">Raspberry Pi</span></div><h5>Physical Computing with Scratch</h5><p class="rp-s">Use Scratch blocks to control an LED, a button, a buzzer, and a motion sensor.</p><p class="rp-learn"><b>You learn:</b> GPIO in Scratch, Event blocks</p><details class="rp-parts"><summary>Parts you need</summary><p>LED, resistor (47 to 330 ohm), button, buzzer, PIR, jumper leads. The page names a Raspberry Pi 4.</p></details><div class="rp-go"><a href="https://projects.raspberrypi.org/en/projects/physical-computing-with-scratch" target="_blank" rel="noopener noreferrer">Open the guide ↗</a><span class="rp-src">Raspberry Pi Foundation projects</span></div></div></article><article class="rp-card" id="p-gpio-music-box" style="--gc:#ffb800" data-lv="2" data-b="pi" data-g="gpio" data-x="1" data-s="gpio music box each button plays a different sound. push a button to hear its sound. button events sound files in python breadboard, four buttons, jumper leads, speakers or headphones. gpio and physical computing"><div class="rp-art"><img src="/images/raspberry-pi-top-50/gpio-music-box.svg" width="360" height="240" loading="lazy" decoding="async" alt="Illustration for GPIO music box"><span class="rp-num">#7</span></div><div class="rp-body"><div class="rp-tags"><span class="rp-tag lv2">Intermediate</span><span class="rp-tag">Raspberry Pi</span></div><h5>GPIO music box</h5><p class="rp-s">Each button plays a different sound. Push a button to hear its sound.</p><p class="rp-learn"><b>You learn:</b> Button events, Sound files in Python</p><details class="rp-parts"><summary>Parts you need</summary><p>Breadboard, four buttons, jumper leads, speakers or headphones.</p></details><div class="rp-go"><a href="https://projects.raspberrypi.org/en/projects/gpio-music-box" target="_blank" rel="noopener noreferrer">Open the guide ↗</a><span class="rp-src">Raspberry Pi Foundation projects</span></div></div></article><article class="rp-card" id="p-python-quick-reaction-game" style="--gc:#ffb800" data-lv="2" data-b="pi" data-g="gpio" data-x="1" data-s="python quick reaction game an led comes on after a random time. two players try to push their button first. random delay read two inputs breadboard, one led, 330 ohm resistor, jumper wires, two buttons. gpio and physical computing"><div class="rp-art"><img src="/images/raspberry-pi-top-50/python-quick-reaction-game.svg" width="360" height="240" loading="lazy" decoding="async" alt="Illustration for Python quick reaction game"><span class="rp-num">#8</span></div><div class="rp-body"><div class="rp-tags"><span class="rp-tag lv2">Intermediate</span><span class="rp-tag">Raspberry Pi</span></div><h5>Python quick reaction game</h5><p class="rp-s">An LED comes on after a random time. Two players try to push their button first.</p><p class="rp-learn"><b>You learn:</b> Random delay, Read two inputs</p><details class="rp-parts"><summary>Parts you need</summary><p>Breadboard, one LED, 330 ohm resistor, jumper wires, two buttons.</p></details><div class="rp-go"><a href="https://projects.raspberrypi.org/en/projects/python-quick-reaction-game" target="_blank" rel="noopener noreferrer">Open the guide ↗</a><span class="rp-src">Raspberry Pi Foundation projects</span></div></div></article><article class="rp-card" id="p-whoopi-cushion" style="--gc:#ffb800" data-lv="2" data-b="pi" data-g="gpio" data-x="1" data-s="whoopi cushion make a pressure switch from paper plates and foil. when a person sits on it, the speakers play a funny noise. make your own switch foil as a conductor crocodile clips, jumper leads, speakers, paper plates, foil, sponge, copper tape. gpio and physical computing"><div class="rp-art"><img src="/images/raspberry-pi-top-50/whoopi-cushion.svg" width="360" height="240" loading="lazy" decoding="async" alt="Illustration for Whoopi cushion"><span class="rp-num">#9</span></div><div class="rp-body"><div class="rp-tags"><span class="rp-tag lv2">Intermediate</span><span class="rp-tag">Raspberry Pi</span></div><h5>Whoopi cushion</h5><p class="rp-s">Make a pressure switch from paper plates and foil. When a person sits on it, the speakers play a funny noise.</p><p class="rp-learn"><b>You learn:</b> Make your own switch, Foil as a conductor</p><details class="rp-parts"><summary>Parts you need</summary><p>Crocodile clips, jumper leads, speakers, paper plates, foil, sponge, copper tape.</p></details><div class="rp-go"><a href="https://projects.raspberrypi.org/en/projects/whoopi-cushion" target="_blank" rel="noopener noreferrer">Open the guide ↗</a><span class="rp-src">Raspberry Pi Foundation projects</span></div></div></article><article class="rp-card" id="p-laser-tripwire" style="--gc:#ffb800" data-lv="2" data-b="pi" data-g="gpio" data-x="1" data-s="raspberry pi laser tripwire point a laser at a light sensor (ldr). when an object breaks the beam, the buzzer sounds. light sensor time measurement with a capacitor alarm logic breadboard, 1 µf capacitor, ldr, jumper leads, laser pointer, drinking straw, buzzer or speaker. gpio and physical computing"><div class="rp-art"><img src="/images/raspberry-pi-top-50/laser-tripwire.svg" width="360" height="240" loading="lazy" decoding="async" alt="Illustration for Raspberry Pi laser tripwire"><span class="rp-num">#10</span></div><div class="rp-body"><div class="rp-tags"><span class="rp-tag lv2">Intermediate</span><span class="rp-tag">Raspberry Pi</span></div><h5>Raspberry Pi laser tripwire</h5><p class="rp-s">Point a laser at a light sensor (LDR). When an object breaks the beam, the buzzer sounds.</p><p class="rp-learn"><b>You learn:</b> Light sensor, Time measurement with a capacitor, Alarm logic</p><details class="rp-parts"><summary>Parts you need</summary><p>Breadboard, 1 µF capacitor, LDR, jumper leads, laser pointer, drinking straw, buzzer or speaker.</p></details><div class="rp-go"><a href="https://projects.raspberrypi.org/en/projects/laser-tripwire" target="_blank" rel="noopener noreferrer">Open the guide ↗</a><span class="rp-src">Raspberry Pi Foundation projects</span></div></div></article><article class="rp-card" id="p-santa-detector" style="--gc:#ffb800" data-lv="1" data-b="pi" data-g="gpio" data-x="1" data-s="santa detector a motion sensor (pir) sends a signal to scratch. scratch then starts an alarm when a person comes into the room. pir motion sensor scratch events pir motion sensor and socket-to-socket jumper leads. the page names a raspberry pi 4. gpio and physical computing"><div class="rp-art"><img src="/images/raspberry-pi-top-50/santa-detector.svg" width="360" height="240" loading="lazy" decoding="async" alt="Illustration for Santa detector"><span class="rp-num">#11</span></div><div class="rp-body"><div class="rp-tags"><span class="rp-tag lv1">Beginner</span><span class="rp-tag">Raspberry Pi</span></div><h5>Santa detector</h5><p class="rp-s">A motion sensor (PIR) sends a signal to Scratch. Scratch then starts an alarm when a person comes into the room.</p><p class="rp-learn"><b>You learn:</b> PIR motion sensor, Scratch events</p><details class="rp-parts"><summary>Parts you need</summary><p>PIR motion sensor and socket-to-socket jumper leads. The page names a Raspberry Pi 4.</p></details><div class="rp-go"><a href="https://projects.raspberrypi.org/en/projects/santa-detector" target="_blank" rel="noopener noreferrer">Open the guide ↗</a><span class="rp-src">Raspberry Pi Foundation projects</span></div></div></article><article class="rp-card" id="p-people-in-space-indicator" style="--gc:#ffb800" data-lv="2" data-b="pi" data-g="gpio" data-x="1" data-s="people in space the pi reads a public web count of the people in space. it then makes one led come on for each person. read web data (api) control many leds breadboard, 10 leds, 10 resistors (the page says 47 ohm), jumper leads. gpio and physical computing"><div class="rp-art"><img src="/images/raspberry-pi-top-50/people-in-space-indicator.svg" width="360" height="240" loading="lazy" decoding="async" alt="Illustration for People in space"><span class="rp-num">#12</span></div><div class="rp-body"><div class="rp-tags"><span class="rp-tag lv2">Intermediate</span><span class="rp-tag">Raspberry Pi</span></div><h5>People in space</h5><p class="rp-s">The Pi reads a public web count of the people in space. It then makes one LED come on for each person.</p><p class="rp-learn"><b>You learn:</b> Read web data (API), Control many LEDs</p><details class="rp-parts"><summary>Parts you need</summary><p>Breadboard, 10 LEDs, 10 resistors (the page says 47 ohm), jumper leads.</p></details><div class="rp-go"><a href="https://projects.raspberrypi.org/en/projects/people-in-space-indicator" target="_blank" rel="noopener noreferrer">Open the guide ↗</a><span class="rp-src">Raspberry Pi Foundation projects</span></div></div></article><article class="rp-card" id="p-ultrasonic-theremin" style="--gc:#ffb800" data-lv="1" data-b="pi" data-g="gpio" data-x="1" data-s="ultrasonic theremin move your hand near an ultrasonic sensor. the distance changes the note from the buzzer. measure distance change a value into a note breadboard, ultrasonic distance sensor, tonal buzzer, six jumper leads. gpio and physical computing"><div class="rp-art"><img src="/images/raspberry-pi-top-50/ultrasonic-theremin.svg" width="360" height="240" loading="lazy" decoding="async" alt="Illustration for Ultrasonic theremin"><span class="rp-num">#13</span></div><div class="rp-body"><div class="rp-tags"><span class="rp-tag lv1">Beginner</span><span class="rp-tag">Raspberry Pi</span></div><h5>Ultrasonic theremin</h5><p class="rp-s">Move your hand near an ultrasonic sensor. The distance changes the note from the buzzer.</p><p class="rp-learn"><b>You learn:</b> Measure distance, Change a value into a note</p><details class="rp-parts"><summary>Parts you need</summary><p>Breadboard, ultrasonic distance sensor, tonal buzzer, six jumper leads.</p></details><div class="rp-go"><a href="https://projects.raspberrypi.org/en/projects/ultrasonic-theremin" target="_blank" rel="noopener noreferrer">Open the guide ↗</a><span class="rp-src">Raspberry Pi Foundation projects</span></div></div></article><article class="rp-card" id="p-scratch-led-game" style="--gc:#ffb800" data-lv="1" data-b="pi" data-g="gpio" data-x="1" data-s="scratch led game play a hide-and-seek game in scratch to find a hedgehog. a real led on your desk is part of the game. gpio output from scratch simple game logic one led, a resistor (47 to 330 ohm), three socket-to-socket jumper cables. use the scratch desktop app. gpio and physical computing"><div class="rp-art"><img src="/images/raspberry-pi-top-50/scratch-led-game.svg" width="360" height="240" loading="lazy" decoding="async" alt="Illustration for Scratch LED game"><span class="rp-num">#14</span></div><div class="rp-body"><div class="rp-tags"><span class="rp-tag lv1">Beginner</span><span class="rp-tag">Raspberry Pi</span></div><h5>Scratch LED game</h5><p class="rp-s">Play a hide-and-seek game in Scratch to find a hedgehog. A real LED on your desk is part of the game.</p><p class="rp-learn"><b>You learn:</b> GPIO output from Scratch, Simple game logic</p><details class="rp-parts"><summary>Parts you need</summary><p>One LED, a resistor (47 to 330 ohm), three socket-to-socket jumper cables. Use the Scratch desktop app.</p></details><div class="rp-go"><a href="https://projects.raspberrypi.org/en/projects/scratch-led-game" target="_blank" rel="noopener noreferrer">Open the guide ↗</a><span class="rp-src">Raspberry Pi Foundation projects</span></div></div></article><article class="rp-card" id="p-rpi-wire-loop-game-scratch" style="--gc:#ffb800" data-lv="1" data-b="pi" data-g="gpio" data-x="1" data-s="wire loop game move a wire loop along a foil track. if the loop touches the track, the buzzer sounds and scratch counts the error. a circuit as a switch count in scratch buzzer, jumper and crocodile leads, pipe cleaners, foil, plasticine or blu tack. gpio and physical computing"><div class="rp-art"><img src="/images/raspberry-pi-top-50/rpi-wire-loop-game-scratch.svg" width="360" height="240" loading="lazy" decoding="async" alt="Illustration for Wire loop game"><span class="rp-num">#15</span></div><div class="rp-body"><div class="rp-tags"><span class="rp-tag lv1">Beginner</span><span class="rp-tag">Raspberry Pi</span></div><h5>Wire loop game</h5><p class="rp-s">Move a wire loop along a foil track. If the loop touches the track, the buzzer sounds and Scratch counts the error.</p><p class="rp-learn"><b>You learn:</b> A circuit as a switch, Count in Scratch</p><details class="rp-parts"><summary>Parts you need</summary><p>Buzzer, jumper and crocodile leads, pipe cleaners, foil, plasticine or Blu Tack.</p></details><div class="rp-go"><a href="https://projects.raspberrypi.org/en/projects/rpi-wire-loop-game-scratch" target="_blank" rel="noopener noreferrer">Open the guide ↗</a><span class="rp-src">Raspberry Pi Foundation projects</span></div></div></article></div></div></div><h3 id="grp-pico">Raspberry Pi Pico (8)</h3><div class="not-prose rp-wrap"><div class="rp-group" data-g="pico"><p class="rp-gintro">A Pico is a small microcontroller. It runs one program and has no desktop.</p><div class="rp-concepts" data-g="pico"><p class="rp-kicker">Learn the idea first</p><div class="rp-cgrid"><figure style="--neon:#00f0ff;--neon2:#ff10f0;--sbg:repeating-linear-gradient(-45deg,rgba(255,255,255,.035) 0 10px,transparent 10px 20px),linear-gradient(120deg,#0a0a12,#16002b);" data-theme="Cyber timeline" class="rp-fig neon" id="fig-pico"><h4>Raspberry Pi or Pico?</h4><p class="rp-sub">Both boards come from Raspberry Pi. They start in very different ways.</p><div class="rp-stage"><svg viewBox="0 0 720 210" role="img" aria-label="A Raspberry Pi boots an operating system before your program. A Pico runs your program at once."><defs><filter id="ng-fig-pico" x="-10%" y="-10%" width="120%" height="120%"><feGaussianBlur in="SourceGraphic" stdDeviation="2.4" result="b"/><feMerge><feMergeNode in="b"/><feMergeNode in="SourceGraphic"/></feMerge></filter></defs><g filter="url(#ng-fig-pico)"><style>#fig-pico .pv-b{opacity:0;animation:pv 6s infinite}@keyframes pv{0%{opacity:0}6%,85%{opacity:1}95%,100%{opacity:0}}</style><text x="20" y="66" font-size="16" font-weight="800" class="t">Raspberry Pi</text><text x="20" y="84" font-size="12" class="tm">a computer</text><g><rect x="150" y="46" width="90" height="40" rx="8" fill="#5a5a80" opacity=".18"/><rect x="150" y="46" width="90" height="40" rx="8" fill="#5a5a80" class="pv-b" style="animation-delay:0s"/><text x="195.0" y="71" text-anchor="middle" font-size="14" font-weight="800" fill="#05010a">Power</text></g><g><rect x="246" y="46" width="110" height="40" rx="8" fill="#00f0ff" opacity=".18"/><rect x="246" y="46" width="110" height="40" rx="8" fill="#00f0ff" class="pv-b" style="animation-delay:0.5s"/><text x="301.0" y="71" text-anchor="middle" font-size="14" font-weight="800" fill="#05010a">Boot loader</text></g><g><rect x="362" y="46" width="110" height="40" rx="8" fill="#7b61ff" opacity=".18"/><rect x="362" y="46" width="110" height="40" rx="8" fill="#7b61ff" class="pv-b" style="animation-delay:1s"/><text x="417.0" y="71" text-anchor="middle" font-size="14" font-weight="800" fill="#05010a">Linux</text></g><g><rect x="478" y="46" width="100" height="40" rx="8" fill="#bc13fe" opacity=".18"/><rect x="478" y="46" width="100" height="40" rx="8" fill="#bc13fe" class="pv-b" style="animation-delay:1.6s"/><text x="528.0" y="71" text-anchor="middle" font-size="14" font-weight="800" fill="#05010a">Desktop</text></g><g><rect x="584" y="46" width="120" height="40" rx="8" fill="#39ff14" opacity=".18"/><rect x="584" y="46" width="120" height="40" rx="8" fill="#39ff14" class="pv-b" style="animation-delay:2.2s"/><text x="644.0" y="71" text-anchor="middle" font-size="14" font-weight="800" fill="#05010a">Your program</text></g><text x="20" y="146" font-size="16" font-weight="800" class="t">Pico</text><text x="20" y="164" font-size="12" class="tm">a microcontroller</text><g><rect x="150" y="126" width="90" height="40" rx="8" fill="#5a5a80" opacity=".18"/><rect x="150" y="126" width="90" height="40" rx="8" fill="#5a5a80" class="pv-b" style="animation-delay:0s"/><text x="195.0" y="151" text-anchor="middle" font-size="14" font-weight="800" fill="#05010a">Power</text></g><g><rect x="246" y="126" width="140" height="40" rx="8" fill="#ff10f0" opacity=".18"/><rect x="246" y="126" width="140" height="40" rx="8" fill="#ff10f0" class="pv-b" style="animation-delay:0.5s"/><text x="316.0" y="151" text-anchor="middle" font-size="14" font-weight="800" fill="#05010a">Your program</text></g></g></svg><span class="rp-badge">Cyber timeline</span></div><div class="rp-cap"><div class="rp-tw" style="margin:0"><table class="rp-t"><thead><tr><th/><th>Raspberry Pi 5</th><th>Pico 2 / Pico</th></tr></thead><tbody><tr><td>What it is</td><td>A small computer</td><td>A microcontroller</td></tr><tr><td>Operating system</td><td>Yes (Raspberry Pi OS)</td><td>No. It runs MicroPython or C directly.</td></tr><tr><td>Programs at one time</td><td>Many</td><td>One</td></tr><tr><td>Desktop, HDMI, USB keyboard</td><td>Yes</td><td>No. Connect it to a computer and use Thonny.</td></tr><tr><td>Best for</td><td>Cameras, web servers, media, AI</td><td>Simple gadgets, toys, sensors on batteries</td></tr></tbody></table></div></div></figure><figure style="--neon:#39ff14;--neon2:#c6ff00;--sbg:linear-gradient(rgba(57,255,20,.13) 1px,transparent 1px) 0 0/40px 34px,linear-gradient(90deg,rgba(57,255,20,.13) 1px,transparent 1px) 0 0/40px 34px,radial-gradient(ellipse at center,#002a08 0%,#000 80%);" data-theme="Oscilloscope" class="rp-fig neon" id="fig-pwm"><h4>PWM: how a digital pin makes a dim light</h4><p class="rp-sub">Move the slider to change the duty cycle.</p><div class="rp-stage"><svg viewBox="0 0 720 200" role="img" aria-label="A PWM square wave and an LED"><defs><filter id="ng-fig-pwm" x="-10%" y="-10%" width="120%" height="120%"><feGaussianBlur in="SourceGraphic" stdDeviation="2.4" result="b"/><feMerge><feMergeNode in="b"/><feMergeNode in="SourceGraphic"/></feMerge></filter></defs><g filter="url(#ng-fig-pwm)"><line x1="40" y1="150" x2="560" y2="150" class="ln" stroke-width="1.5"/><line x1="40" y1="40" x2="40" y2="150" class="ln" stroke-width="1.5"/><text x="34" y="56" text-anchor="end" font-size="12" class="tm">3.3 V</text><text x="34" y="154" text-anchor="end" font-size="12" class="tm">0 V</text><path id="pwm-w" d="" stroke="#39ff14" stroke-width="4" fill="none" stroke-linejoin="round"/><text x="300" y="182" text-anchor="middle" font-size="13" class="tm">time → (one cycle is very short, so the eye sees an average)</text><circle id="pwm-g" cx="640" cy="88" r="50" fill="#c6ff00" opacity=".3"/><path d="M622 112 V80 a18 18 0 0 1 36 0 V112 Z" fill="#c6ff00"/><rect x="618" y="110" width="44" height="8" rx="2" fill="#c6ff00"/></g></svg><span class="rp-badge">Oscilloscope</span></div><div class="rp-ctrl"><label for="pwm-r">Duty cycle</label><input id="pwm-r" type="range" min="0" max="100" step="5" value="25"><span class="rp-out" id="pwm-o">25% on · average ≈ 0.8 V</span></div><div class="rp-cap"><p><b>PWM</b> (pulse-width modulation) switches a pin on and off very fast. The<b>duty cycle</b> is the percentage of time that the pin is on. A high duty cycle makes an LED bright. A low duty cycle makes it dim. The Beating heart and LED firefly projects use this method. A buzzer uses the same idea, but the<em>frequency</em> of the pulses sets the musical note.</p></div></figure><figure style="--neon:#fff01f;--neon2:#39ff14;--sbg:radial-gradient(circle at 40% 55%,rgba(255,240,31,.18),transparent 45%),linear-gradient(135deg,#0d0221,#261447 60%,#0d0221);" data-theme="Electric" class="rp-fig neon" id="fig-relay"><h4>How a relay switches a big load from a small pin</h4><p class="rp-sub">Push the button to send a signal from the Pico.</p><div class="rp-stage"><svg viewBox="0 0 720 240" role="img" aria-label="A relay: a small control circuit closes a switch in a separate pump circuit"><defs><filter id="ng-fig-relay" x="-10%" y="-10%" width="120%" height="120%"><feGaussianBlur in="SourceGraphic" stdDeviation="2.4" result="b"/><feMerge><feMergeNode in="b"/><feMergeNode in="SourceGraphic"/></feMerge></filter></defs><g filter="url(#ng-fig-relay)"><rect x="20" y="20" width="300" height="200" rx="14" class="pn" stroke-dasharray="6 6"/><text x="36" y="46" font-size="14" font-weight="800" class="t">Control circuit · 3.3 V</text><rect x="380" y="20" width="320" height="200" rx="14" class="pn" stroke-dasharray="6 6"/><text x="396" y="46" font-size="14" font-weight="800" class="t">Load circuit · 12 V</text><rect x="40" y="90" width="80" height="60" rx="8" fill="#ff6b00"/><text x="80" y="125" text-anchor="middle" font-size="14" fill="#fff" font-weight="800">Pico</text><path d="M120 105 H250 V115 M250 165 V185 H120 V140" class="wr" stroke-width="3"/><path id="rl-cf" d="M120 105 H250 V115 M250 165 V185 H120 V140" stroke="#39ff14" stroke-width="3" fill="none" class="flow" opacity="0"/><g id="rl-coil"><path d="M232 118 a18 5 0 0 0 36 0" stroke="#ffe600" stroke-width="4" fill="none"/><path d="M232 128 a18 5 0 0 0 36 0" stroke="#ffe600" stroke-width="4" fill="none"/><path d="M232 138 a18 5 0 0 0 36 0" stroke="#ffe600" stroke-width="4" fill="none"/><path d="M232 148 a18 5 0 0 0 36 0" stroke="#ffe600" stroke-width="4" fill="none"/><path d="M232 158 a18 5 0 0 0 36 0" stroke="#ffe600" stroke-width="4" fill="none"/></g><text x="280" y="145" font-size="12" class="tm">coil</text><path id="rl-mag" d="M272 140 C320 140 340 130 360 120" stroke="#ffe600" stroke-width="2" stroke-dasharray="3 5" fill="none" opacity="0"/><circle cx="430" cy="140" r="6" class="acc"/><circle cx="500" cy="140" r="6" class="acc"/><line id="rl-arm" x1="430" y1="140" x2="496" y2="112" stroke="var(--fg)" stroke-width="5" stroke-linecap="round" style="transition:all .3s"/><text x="465" y="170" text-anchor="middle" font-size="12" class="tm">switch</text><rect x="400" y="190" width="70" height="24" rx="5" fill="#3a2a6a"/><text x="435" y="207" text-anchor="middle" font-size="12" fill="#fff">12 V</text><path d="M430 146 V190 M470 202 H640 V170 M500 140 H600" class="wr" stroke-width="3"/><path id="rl-lf" d="M500 140 H600 M640 170 V202 H470" stroke="#39ff14" stroke-width="3" fill="none" class="flow" opacity="0"/><rect x="590" y="110" width="90" height="60" rx="10" fill="#00b3ff"/><text x="635" y="145" text-anchor="middle" font-size="14" fill="#fff" font-weight="800">pump</text><g id="rl-w" opacity="0"><path d="M0 0 q-5 8 0 12 q5 -4 0 -12 Z" fill="#00e5ff" transform="translate(610 80)"><animateTransform attributeName="transform" type="translate" values="610 64;610 98" dur="0.9s" begin="0.0s" repeatCount="indefinite"/></path><path d="M0 0 q-5 8 0 12 q5 -4 0 -12 Z" fill="#00e5ff" transform="translate(624 80)"><animateTransform attributeName="transform" type="translate" values="624 64;624 98" dur="0.9s" begin="0.3s" repeatCount="indefinite"/></path><path d="M0 0 q-5 8 0 12 q5 -4 0 -12 Z" fill="#00e5ff" transform="translate(638 80)"><animateTransform attributeName="transform" type="translate" values="638 64;638 98" dur="0.9s" begin="0.6s" repeatCount="indefinite"/></path><path d="M0 0 q-5 8 0 12 q5 -4 0 -12 Z" fill="#00e5ff" transform="translate(652 80)"><animateTransform attributeName="transform" type="translate" values="652 64;652 98" dur="0.9s" begin="0.8999999999999999s" repeatCount="indefinite"/></path></g></g></svg><span class="rp-badge">Electric</span></div><div class="rp-ctrl"><button class="rp-btn" id="rl-b">Put a hand near the sensor</button><span class="rp-out" id="rl-o">GPIO pin: OFF · pump: OFF</span></div><div class="rp-cap"><p>A GPIO pin cannot supply a pump. A<b>relay</b> is a switch that a small current operates. Current in the coil makes a magnet. The magnet pulls the switch closed. The pump then receives power from its own 12 V supply. The two circuits do not connect electrically.</p><p class="rp-w" style="margin:0"><b>WARNING</b>Do not connect mains voltage to a relay in a hobby project. Use only low-voltage supplies, for example 5 V or 12 V.</p></div></figure></div></div><div class="rp-grid"><article class="rp-card" id="p-get-started-pico-w" style="--gc:#ff10f0" data-lv="1" data-b="pico" data-g="pico" data-x="1" data-s="getting started with raspberry pi pico w install micropython on a pico w and connect it to wi-fi. serve a small web page that switches the onboard led. micropython wi-fi on a microcontroller a small web server raspberry pi pico w, micro usb data cable, and a computer with thonny on the same network. raspberry pi pico"><div class="rp-art"><img src="/images/raspberry-pi-top-50/get-started-pico-w.svg" width="360" height="240" loading="lazy" decoding="async" alt="Illustration for Getting started with Raspberry Pi Pico W"><span class="rp-num">#16</span></div><div class="rp-body"><div class="rp-tags"><span class="rp-tag lv1">Beginner</span><span class="rp-tag">Pico</span></div><h5>Getting started with Raspberry Pi Pico W</h5><p class="rp-s">Install MicroPython on a Pico W and connect it to Wi-Fi. Serve a small web page that switches the onboard LED.</p><p class="rp-learn"><b>You learn:</b> MicroPython, Wi-Fi on a microcontroller, A small web server</p><details class="rp-parts"><summary>Parts you need</summary><p>Raspberry Pi Pico W, micro USB data cable, and a computer with Thonny on the same network.</p></details><div class="rp-go"><a href="https://projects.raspberrypi.org/en/projects/get-started-pico-w" target="_blank" rel="noopener noreferrer">Open the guide ↗</a><span class="rp-src">Raspberry Pi Foundation projects</span></div></div></article><article class="rp-card" id="p-getting-started-with-the-pico" style="--gc:#ff10f0" data-lv="2" data-b="pico" data-g="pico" data-x="1" data-s="getting started with raspberry pi pico connect a pico and install micropython. make the onboard led flash. optional examples use a button and an analogue input. thonny editor digital and analogue pins a pico and a usb cable. the later examples use optional parts. raspberry pi pico"><div class="rp-art"><img src="/images/raspberry-pi-top-50/getting-started-with-the-pico.svg" width="360" height="240" loading="lazy" decoding="async" alt="Illustration for Getting started with Raspberry Pi Pico"><span class="rp-num">#17</span></div><div class="rp-body"><div class="rp-tags"><span class="rp-tag lv2">Intermediate</span><span class="rp-tag">Pico</span></div><h5>Getting started with Raspberry Pi Pico</h5><p class="rp-s">Connect a Pico and install MicroPython. Make the onboard LED flash. Optional examples use a button and an analogue input.</p><p class="rp-learn"><b>You learn:</b> Thonny editor, Digital and analogue pins</p><details class="rp-parts"><summary>Parts you need</summary><p>A Pico and a USB cable. The later examples use optional parts.</p></details><div class="rp-go"><a href="https://projects.raspberrypi.org/en/projects/getting-started-with-the-pico" target="_blank" rel="noopener noreferrer">Open the guide ↗</a><span class="rp-src">Raspberry Pi Foundation projects</span></div></div></article><article class="rp-card" id="p-led-firefly" style="--gc:#ff10f0" data-lv="1" data-b="pico" data-g="pico" data-x="1" data-s="led firefly a pico flashes an led in a firefly pattern. a handmade wire switch starts the light. flash patterns a handmade switch pico with headers, usb data cable, one led, a resistor (75 to 220 ohm), jumper wires. raspberry pi pico"><div class="rp-art"><img src="/images/raspberry-pi-top-50/led-firefly.svg" width="360" height="240" loading="lazy" decoding="async" alt="Illustration for LED firefly"><span class="rp-num">#18</span></div><div class="rp-body"><div class="rp-tags"><span class="rp-tag lv1">Beginner</span><span class="rp-tag">Pico</span></div><h5>LED firefly</h5><p class="rp-s">A Pico flashes an LED in a firefly pattern. A handmade wire switch starts the light.</p><p class="rp-learn"><b>You learn:</b> Flash patterns, A handmade switch</p><details class="rp-parts"><summary>Parts you need</summary><p>Pico with headers, USB data cable, one LED, a resistor (75 to 220 ohm), jumper wires.</p></details><div class="rp-go"><a href="https://projects.raspberrypi.org/en/projects/led-firefly" target="_blank" rel="noopener noreferrer">Open the guide ↗</a><span class="rp-src">Raspberry Pi Foundation projects</span></div></div></article><article class="rp-card" id="p-party-popper" style="--gc:#ff10f0" data-lv="1" data-b="pico" data-g="pico" data-x="1" data-s="party popper pull a card-and-foil switch. the pico then shows colours on an rgb led and plays a sound on a buzzer. rgb led colours buzzer tones pico with headers, usb data cable, passive buzzer, common-cathode rgb led, three resistors, jumper wires, card, foil, string. raspberry pi pico"><div class="rp-art"><img src="/images/raspberry-pi-top-50/party-popper.svg" width="360" height="240" loading="lazy" decoding="async" alt="Illustration for Party popper"><span class="rp-num">#19</span></div><div class="rp-body"><div class="rp-tags"><span class="rp-tag lv1">Beginner</span><span class="rp-tag">Pico</span></div><h5>Party popper</h5><p class="rp-s">Pull a card-and-foil switch. The Pico then shows colours on an RGB LED and plays a sound on a buzzer.</p><p class="rp-learn"><b>You learn:</b> RGB LED colours, Buzzer tones</p><details class="rp-parts"><summary>Parts you need</summary><p>Pico with headers, USB data cable, passive buzzer, common-cathode RGB LED, three resistors, jumper wires, card, foil, string.</p></details><div class="rp-go"><a href="https://projects.raspberrypi.org/en/projects/party-popper" target="_blank" rel="noopener noreferrer">Open the guide ↗</a><span class="rp-src">Raspberry Pi Foundation projects</span></div></div></article><article class="rp-card" id="p-beating-heart" style="--gc:#ff10f0" data-lv="2" data-b="pico" data-g="pico" data-x="1" data-s="beating heart an led in a paper heart pulses like a heartbeat. turn a dial (potentiometer) to set the speed of the beat. analogue input led brightness with pwm pico with headers, usb cable, red led with resistor, potentiometer, jumper wires, paper, tape. raspberry pi pico"><div class="rp-art"><img src="/images/raspberry-pi-top-50/beating-heart.svg" width="360" height="240" loading="lazy" decoding="async" alt="Illustration for Beating heart"><span class="rp-num">#20</span></div><div class="rp-body"><div class="rp-tags"><span class="rp-tag lv2">Intermediate</span><span class="rp-tag">Pico</span></div><h5>Beating heart</h5><p class="rp-s">An LED in a paper heart pulses like a heartbeat. Turn a dial (potentiometer) to set the speed of the beat.</p><p class="rp-learn"><b>You learn:</b> Analogue input, LED brightness with PWM</p><details class="rp-parts"><summary>Parts you need</summary><p>Pico with headers, USB cable, red LED with resistor, potentiometer, jumper wires, paper, tape.</p></details><div class="rp-go"><a href="https://projects.raspberrypi.org/en/projects/beating-heart" target="_blank" rel="noopener noreferrer">Open the guide ↗</a><span class="rp-src">Raspberry Pi Foundation projects</span></div></div></article><article class="rp-card" id="p-time-to-make" style="--gc:#ff10f0" data-lv="2" data-b="pico" data-g="pico" data-x="1" data-s="time to make a stepper motor turns a cardboard wheel. the wheel stops at a random prompt. stepper motor control random choice pico, usb cable, breadboard, jumper wires, stepper motor and driver, button, led, 220 ohm resistor. raspberry pi pico"><div class="rp-art"><img src="/images/raspberry-pi-top-50/time-to-make.svg" width="360" height="240" loading="lazy" decoding="async" alt="Illustration for Time to make"><span class="rp-num">#21</span></div><div class="rp-body"><div class="rp-tags"><span class="rp-tag lv2">Intermediate</span><span class="rp-tag">Pico</span></div><h5>Time to make</h5><p class="rp-s">A stepper motor turns a cardboard wheel. The wheel stops at a random prompt.</p><p class="rp-learn"><b>You learn:</b> Stepper motor control, Random choice</p><details class="rp-parts"><summary>Parts you need</summary><p>Pico, USB cable, breadboard, jumper wires, stepper motor and driver, button, LED, 220 ohm resistor.</p></details><div class="rp-go"><a href="https://projects.raspberrypi.org/en/projects/time-to-make" target="_blank" rel="noopener noreferrer">Open the guide ↗</a><span class="rp-src">Raspberry Pi Foundation projects</span></div></div></article><article class="rp-card" id="p-touch-free-tap" style="--gc:#ff10f0" data-lv="2" data-b="pico" data-g="pico" data-x="1" data-s="touch-free tap put your hands near an ultrasonic sensor. the pico switches a relay, and a small pump gives water. distance sensor relay switch pump control pico, 5 v usb supply, hc-sr04 ultrasonic sensor, relay, 5 to 12 v submersible pump. raspberry pi pico"><div class="rp-art"><img src="/images/raspberry-pi-top-50/touch-free-tap.svg" width="360" height="240" loading="lazy" decoding="async" alt="Illustration for Touch-free tap"><span class="rp-num">#22</span></div><div class="rp-body"><div class="rp-tags"><span class="rp-tag lv2">Intermediate</span><span class="rp-tag">Pico</span></div><h5>Touch-free tap</h5><p class="rp-s">Put your hands near an ultrasonic sensor. The Pico switches a relay, and a small pump gives water.</p><p class="rp-learn"><b>You learn:</b> Distance sensor, Relay switch, Pump control</p><details class="rp-parts"><summary>Parts you need</summary><p>Pico, 5 V USB supply, HC-SR04 ultrasonic sensor, relay, 5 to 12 V submersible pump.</p></details><div class="rp-go"><a href="https://projects.raspberrypi.org/en/projects/touch-free-tap" target="_blank" rel="noopener noreferrer">Open the guide ↗</a><span class="rp-src">Raspberry Pi Foundation projects</span></div></div></article><article class="rp-card" id="p-sound-machine" style="--gc:#ff10f0" data-lv="3" data-b="pico" data-g="pico" data-x="1" data-s="sound machine use buttons or a dial to select sounds and tunes. a passive buzzer plays them. tones and frequency design a user input pico with headers, usb data cable, potentiometer or buttons, passive buzzer, jumper wires, craft materials. raspberry pi pico"><div class="rp-art"><img src="/images/raspberry-pi-top-50/sound-machine.svg" width="360" height="240" loading="lazy" decoding="async" alt="Illustration for Sound machine"><span class="rp-num">#23</span></div><div class="rp-body"><div class="rp-tags"><span class="rp-tag lv3">Advanced</span><span class="rp-tag">Pico</span></div><h5>Sound machine</h5><p class="rp-s">Use buttons or a dial to select sounds and tunes. A passive buzzer plays them.</p><p class="rp-learn"><b>You learn:</b> Tones and frequency, Design a user input</p><details class="rp-parts"><summary>Parts you need</summary><p>Pico with headers, USB data cable, potentiometer or buttons, passive buzzer, jumper wires, craft materials.</p></details><div class="rp-go"><a href="https://projects.raspberrypi.org/en/projects/sound-machine" target="_blank" rel="noopener noreferrer">Open the guide ↗</a><span class="rp-src">Raspberry Pi Foundation projects</span></div></div></article></div></div></div><h3 id="grp-camera">Camera (6)</h3><div class="not-prose rp-wrap"><div class="rp-group" data-g="camera"><p class="rp-gintro">These projects use a Camera Module for photos, video, time-lapse, and plant science.</p><div class="rp-concepts" data-g="camera"><p class="rp-kicker">Learn the idea first</p><div class="rp-cgrid"><figure style="--neon:#ffb800;--neon2:#39ff14;--sbg:radial-gradient(circle at 15% 40%,rgba(255,60,0,.35),transparent 45%),linear-gradient(160deg,#2a0500,#120100);" data-theme="Darkroom" class="rp-fig neon" id="fig-tl"><h4>Time-lapse: from many photos to one video</h4><p class="rp-sub">Each new frame is one photo.</p><div class="rp-stage"><svg viewBox="0 0 720 200" role="img" aria-label="A camera takes one photo every 10 minutes. The photos join into a short video."><defs><filter id="ng-fig-tl" x="-10%" y="-10%" width="120%" height="120%"><feGaussianBlur in="SourceGraphic" stdDeviation="2.4" result="b"/><feMerge><feMergeNode in="b"/><feMergeNode in="SourceGraphic"/></feMerge></filter></defs><g filter="url(#ng-fig-tl)"><style>#fig-tl .tl-f{opacity:0;animation:tl 6s infinite}@keyframes tl{0%{opacity:0}8%,88%{opacity:1}100%{opacity:0}}</style><rect x="40" y="56" width="90" height="70" rx="10" fill="#4a1a00"/><circle cx="85" cy="91" r="22" fill="#0f172a" stroke="#64748b" stroke-width="3"/><circle cx="85" cy="91" r="10" fill="#ffb800"/><text x="85" y="150" text-anchor="middle" font-size="13" class="tm">1 photo / 10 min</text><path d="M140 91 H215" class="ln" stroke-width="2.5" stroke-dasharray="5 6"/><g class="tl-f" style="animation-delay:0.0s"><rect x="230" y="60" width="46" height="60" rx="3" fill="#2b1200"/><path d="M253 110 v-8" stroke="#39ff14" stroke-width="3"/><ellipse cx="253" cy="104" rx="4" ry="3" fill="#adff2f"/></g><g class="tl-f" style="animation-delay:0.5s"><rect x="282" y="60" width="46" height="60" rx="3" fill="#2b1200"/><path d="M305 110 v-13" stroke="#39ff14" stroke-width="3"/><ellipse cx="305" cy="99" rx="5" ry="3" fill="#adff2f"/></g><g class="tl-f" style="animation-delay:1.0s"><rect x="334" y="60" width="46" height="60" rx="3" fill="#2b1200"/><path d="M357 110 v-18" stroke="#39ff14" stroke-width="3"/><ellipse cx="357" cy="94" rx="6" ry="3" fill="#adff2f"/></g><g class="tl-f" style="animation-delay:1.5s"><rect x="386" y="60" width="46" height="60" rx="3" fill="#2b1200"/><path d="M409 110 v-23" stroke="#39ff14" stroke-width="3"/><ellipse cx="409" cy="89" rx="7" ry="3" fill="#adff2f"/></g><g class="tl-f" style="animation-delay:2.0s"><rect x="438" y="60" width="46" height="60" rx="3" fill="#2b1200"/><path d="M461 110 v-28" stroke="#39ff14" stroke-width="3"/><ellipse cx="461" cy="84" rx="8" ry="3" fill="#adff2f"/></g><g class="tl-f" style="animation-delay:2.5s"><rect x="490" y="60" width="46" height="60" rx="3" fill="#2b1200"/><path d="M513 110 v-33" stroke="#39ff14" stroke-width="3"/><ellipse cx="513" cy="79" rx="9" ry="3" fill="#adff2f"/></g><g class="tl-f" style="animation-delay:3.0s"><rect x="542" y="60" width="46" height="60" rx="3" fill="#2b1200"/><path d="M565 110 v-38" stroke="#39ff14" stroke-width="3"/><ellipse cx="565" cy="74" rx="10" ry="3" fill="#adff2f"/></g><g class="tl-f" style="animation-delay:3.5s"><rect x="594" y="60" width="46" height="60" rx="3" fill="#2b1200"/><path d="M617 110 v-43" stroke="#39ff14" stroke-width="3"/><ellipse cx="617" cy="69" rx="11" ry="3" fill="#adff2f"/></g><text x="440" y="150" text-anchor="middle" font-size="13" class="tm">frames on the SD card</text><text x="440" y="186" text-anchor="middle" font-size="15" font-weight="800" class="t">1 day = 144 photos → play at 25 per second → a 6-second video</text></g></svg><span class="rp-badge">Darkroom</span></div><div class="rp-cap"><p>A<b>time-lapse</b> shows slow changes fast. The camera takes a photo at fixed intervals. Software joins the photos into a video. Stop motion uses the same idea, but you push a button for each frame. The cress egg heads and the push-button stop motion projects use this method.</p></div></figure><figure style="--neon:#ff00ff;--neon2:#39ff14;--sbg:radial-gradient(circle at 20% 50%,rgba(255,80,0,.35),transparent 40%),linear-gradient(90deg,#1a0030,#3b0058 50%,#05000d);" data-theme="Thermal" class="rp-fig neon" id="fig-ndvi"><h4>NDVI: see plant health with a camera</h4><p class="rp-sub">Compare a healthy leaf with a stressed leaf.</p><div class="rp-stage"><svg viewBox="0 0 720 220" role="img" aria-label="Healthy leaves reflect much near-infrared light and little red light"><defs><filter id="ng-fig-ndvi" x="-10%" y="-10%" width="120%" height="120%"><feGaussianBlur in="SourceGraphic" stdDeviation="2.4" result="b"/><feMerge><feMergeNode in="b"/><feMergeNode in="SourceGraphic"/></feMerge></filter></defs><g filter="url(#ng-fig-ndvi)"><path id="nd-leaf" d="M140 190 C40 140 60 40 140 20 C220 40 240 140 140 190 Z" fill="#39ff14" style="transition:fill .4s"/><path d="M140 190 V30" stroke="#fff" stroke-width="2" opacity=".5"/><line x1="320" y1="180" x2="560" y2="180" class="ln" stroke-width="1.5"/><rect id="nd-nir" x="350" y="80" width="70" height="100" rx="4" fill="#ff00ff" style="transition:all .4s"/><rect id="nd-red" x="460" y="164" width="70" height="16" rx="4" fill="#ff3131" style="transition:all .4s"/><text x="385" y="200" text-anchor="middle" font-size="13" class="t">NIR</text><text x="495" y="200" text-anchor="middle" font-size="13" class="t">Red</text><text x="440" y="40" text-anchor="middle" font-size="13" class="tm">light that the leaf reflects</text><text x="640" y="96" text-anchor="middle" font-size="14" class="tm">NDVI</text><text id="nd-v" x="640" y="130" text-anchor="middle" font-size="34" font-weight="900" class="t">0.72</text><text id="nd-l" x="640" y="156" text-anchor="middle" font-size="13" class="tm">healthy</text></g></svg><span class="rp-badge">Thermal</span></div><div class="rp-ctrl"><button class="rp-btn on" data-nd="h">Healthy leaf</button><button class="rp-btn" data-nd="s">Stressed leaf</button><span class="rp-out">NDVI = (NIR − Red) ÷ (NIR + Red)</span></div><div class="rp-cap"><p>A healthy leaf absorbs red light for photosynthesis. It reflects a lot of near-infrared (NIR) light. A stressed leaf reflects less NIR and more red. A NoIR camera can see NIR. The formula gives a number from −1 to +1. A higher number shows a healthier plant. The values in this diagram are examples only.</p></div></figure></div></div><div class="rp-grid"><article class="rp-card" id="p-getting-started-with-picamera" style="--gc:#bc13fe" data-lv="2" data-b="pi" data-g="camera" data-x="1" data-s="getting started with the camera module connect a camera module to the pi. take photos and record video from the command line and from python. camera ribbon cable photos and video in python a camera module. a zero and a pi 5 need the smaller ribbon cable. camera"><div class="rp-art"><img src="/images/raspberry-pi-top-50/getting-started-with-picamera.svg" width="360" height="240" loading="lazy" decoding="async" alt="Illustration for Getting started with the Camera Module"><span class="rp-num">#24</span></div><div class="rp-body"><div class="rp-tags"><span class="rp-tag lv2">Intermediate</span><span class="rp-tag">Raspberry Pi</span></div><h5>Getting started with the Camera Module</h5><p class="rp-s">Connect a Camera Module to the Pi. Take photos and record video from the command line and from Python.</p><p class="rp-learn"><b>You learn:</b> Camera ribbon cable, Photos and video in Python</p><details class="rp-parts"><summary>Parts you need</summary><p>A Camera Module. A Zero and a Pi 5 need the smaller ribbon cable.</p></details><div class="rp-go"><a href="https://projects.raspberrypi.org/en/projects/getting-started-with-picamera" target="_blank" rel="noopener noreferrer">Open the guide ↗</a><span class="rp-src">Raspberry Pi Foundation projects</span></div></div></article><article class="rp-card" id="p-cress-egg-heads" style="--gc:#bc13fe" data-lv="2" data-b="pi" data-g="camera" data-x="1" data-s="cress egg heads grow cress in an eggshell. the camera takes a photo at set intervals. join the photos into a time-lapse video. time-lapse timed capture camera module, eggshell and egg cup, cotton wool, cress seeds. camera"><div class="rp-art"><img src="/images/raspberry-pi-top-50/cress-egg-heads.svg" width="360" height="240" loading="lazy" decoding="async" alt="Illustration for Cress egg heads"><span class="rp-num">#25</span></div><div class="rp-body"><div class="rp-tags"><span class="rp-tag lv2">Intermediate</span><span class="rp-tag">Raspberry Pi</span></div><h5>Cress egg heads</h5><p class="rp-s">Grow cress in an eggshell. The camera takes a photo at set intervals. Join the photos into a time-lapse video.</p><p class="rp-learn"><b>You learn:</b> Time-lapse, Timed capture</p><details class="rp-parts"><summary>Parts you need</summary><p>Camera Module, eggshell and egg cup, cotton wool, cress seeds.</p></details><div class="rp-go"><a href="https://projects.raspberrypi.org/en/projects/cress-egg-heads" target="_blank" rel="noopener noreferrer">Open the guide ↗</a><span class="rp-src">Raspberry Pi Foundation projects</span></div></div></article><article class="rp-card" id="p-push-button-stop-motion" style="--gc:#bc13fe" data-lv="3" data-b="pi" data-g="camera" data-x="1" data-s="push-button stop motion each push of a gpio button takes the next frame of a stop-motion film. capture from a button join frames into a video camera module, full-size breadboard, two jumper leads, button. camera"><div class="rp-art"><img src="/images/raspberry-pi-top-50/push-button-stop-motion.svg" width="360" height="240" loading="lazy" decoding="async" alt="Illustration for Push-button stop motion"><span class="rp-num">#26</span></div><div class="rp-body"><div class="rp-tags"><span class="rp-tag lv3">Advanced</span><span class="rp-tag">Raspberry Pi</span></div><h5>Push-button stop motion</h5><p class="rp-s">Each push of a GPIO button takes the next frame of a stop-motion film.</p><p class="rp-learn"><b>You learn:</b> Capture from a button, Join frames into a video</p><details class="rp-parts"><summary>Parts you need</summary><p>Camera Module, full-size breadboard, two jumper leads, button.</p></details><div class="rp-go"><a href="https://projects.raspberrypi.org/en/projects/push-button-stop-motion" target="_blank" rel="noopener noreferrer">Open the guide ↗</a><span class="rp-src">Raspberry Pi Foundation projects</span></div></div></article><article class="rp-card" id="p-infrared-bird-box" style="--gc:#bc13fe" data-lv="3" data-b="pi" data-g="camera" data-x="1" data-s="infrared bird box a noir camera and infrared leds record a nest box. the birds do not see a bright white light. infrared light noir camera noir camera module, female jumper leads, 220 ohm resistors, 5 mm infrared leds. camera"><div class="rp-art"><img src="/images/raspberry-pi-top-50/infrared-bird-box.svg" width="360" height="240" loading="lazy" decoding="async" alt="Illustration for Infrared bird box"><span class="rp-num">#27</span></div><div class="rp-body"><div class="rp-tags"><span class="rp-tag lv3">Advanced</span><span class="rp-tag">Raspberry Pi</span></div><h5>Infrared bird box</h5><p class="rp-s">A NoIR camera and infrared LEDs record a nest box. The birds do not see a bright white light.</p><p class="rp-learn"><b>You learn:</b> Infrared light, NoIR camera</p><details class="rp-parts"><summary>Parts you need</summary><p>NoIR camera module, female jumper leads, 220 ohm resistors, 5 mm infrared LEDs.</p></details><div class="rp-go"><a href="https://projects.raspberrypi.org/en/projects/infrared-bird-box" target="_blank" rel="noopener noreferrer">Open the guide ↗</a><span class="rp-src">Raspberry Pi Foundation projects</span></div></div></article><article class="rp-card" id="p-astropi-ndvi" style="--gc:#bc13fe" data-lv="3" data-b="pi" data-g="camera" data-x="1" data-s="capture plant health with ndvi use a filtered or noir camera and python. change leaf photos into a simple picture of plant health. near-infrared light the ndvi formula image maths high quality camera or noir module, with a red filter and an 850 nm nir filter, or a rosco 26 filter. camera"><div class="rp-art"><img src="/images/raspberry-pi-top-50/astropi-ndvi.svg" width="360" height="240" loading="lazy" decoding="async" alt="Illustration for Capture plant health with NDVI"><span class="rp-num">#28</span></div><div class="rp-body"><div class="rp-tags"><span class="rp-tag lv3">Advanced</span><span class="rp-tag">Raspberry Pi</span></div><h5>Capture plant health with NDVI</h5><p class="rp-s">Use a filtered or NoIR camera and Python. Change leaf photos into a simple picture of plant health.</p><p class="rp-learn"><b>You learn:</b> Near-infrared light, The NDVI formula, Image maths</p><details class="rp-parts"><summary>Parts you need</summary><p>High Quality Camera or NoIR module, with a red filter and an 850 nm NIR filter, or a Rosco 26 filter.</p></details><div class="rp-go"><a href="https://projects.raspberrypi.org/en/projects/astropi-ndvi" target="_blank" rel="noopener noreferrer">Open the guide ↗</a><span class="rp-src">Raspberry Pi Foundation projects</span></div></div></article><article class="rp-card" id="p-the-all-seeing-pi" style="--gc:#bc13fe" data-lv="2" data-b="pi" data-g="camera" data-x="1" data-s="the all-seeing pi make a photo booth with a touchscreen. push a button to take a photo. camera preview a simple photo app camera module, touchscreen or a normal monitor, two buttons, breadboard, jumper leads. camera"><div class="rp-art"><img src="/images/raspberry-pi-top-50/the-all-seeing-pi.svg" width="360" height="240" loading="lazy" decoding="async" alt="Illustration for The All-Seeing Pi"><span class="rp-num">#29</span><span class="rp-arch" title="The page is still online but not in the main catalogue">Archived</span></div><div class="rp-body"><div class="rp-tags"><span class="rp-tag lv2">Intermediate</span><span class="rp-tag">Raspberry Pi</span></div><h5>The All-Seeing Pi</h5><p class="rp-s">Make a photo booth with a touchscreen. Push a button to take a photo.</p><p class="rp-learn"><b>You learn:</b> Camera preview, A simple photo app</p><details class="rp-parts"><summary>Parts you need</summary><p>Camera Module, touchscreen or a normal monitor, two buttons, breadboard, jumper leads.</p></details><div class="rp-go"><a href="https://projects.raspberrypi.org/en/projects/the-all-seeing-pi" target="_blank" rel="noopener noreferrer">Open the guide ↗</a><span class="rp-src">Raspberry Pi Foundation projects</span></div></div></article></div></div></div><h3 id="grp-media">Media centre (2)</h3><div class="not-prose rp-wrap"><div class="rp-group" data-g="media"><p class="rp-gintro">The Pi plays music and video. It sends the picture to a TV through HDMI.</p><div class="rp-concepts" data-g="media"><p class="rp-kicker">Learn the idea first</p><div class="rp-cgrid"><figure style="--neon:#ff10f0;--neon2:#00f0ff;--sbg:radial-gradient(ellipse at 85% 50%,rgba(255,16,240,.28),transparent 50%),linear-gradient(135deg,#1a0010,#3d0030 60%,#120018);" data-theme="Cinema" class="rp-fig neon" id="fig-media"><h4>How a Pi media centre works</h4><p class="rp-sub">Video flows from left to right. Commands come from the phone.</p><div class="rp-stage"><svg viewBox="0 0 720 220" role="img" aria-label="Video goes from a file or stream through the Pi and HDMI to a TV. A phone sends commands."><defs><filter id="ng-fig-media" x="-10%" y="-10%" width="120%" height="120%"><feGaussianBlur in="SourceGraphic" stdDeviation="2.4" result="b"/><feMerge><feMergeNode in="b"/><feMergeNode in="SourceGraphic"/></feMerge></filter></defs><g filter="url(#ng-fig-media)"><rect x="20" y="40" width="130" height="56" rx="10" class="bx" stroke-width="1.5"/><text x="85" y="66" text-anchor="middle" font-size="14" font-weight="800" class="t">Video file</text><text x="85" y="84" text-anchor="middle" font-size="12" class="tm">USB drive</text><rect x="20" y="124" width="130" height="56" rx="10" class="bx" stroke-width="1.5"/><text x="85" y="150" text-anchor="middle" font-size="14" font-weight="800" class="t">Stream</text><text x="85" y="168" text-anchor="middle" font-size="12" class="tm">home network</text><path d="M150 68 C200 68 210 110 260 110 M150 152 C200 152 210 110 260 110" stroke="#ff10f0" stroke-width="3" fill="none" class="flow"/><rect x="260" y="70" width="150" height="80" rx="10" fill="#8f00ff"/><text x="335" y="104" text-anchor="middle" font-size="15" fill="#fff" font-weight="800">Raspberry Pi</text><text x="335" y="124" text-anchor="middle" font-size="12" fill="#f0c8ff">Kodi decodes video</text><path d="M410 110 H520" stroke="#ff10f0" stroke-width="5" fill="none" class="flow"/><text x="465" y="100" text-anchor="middle" font-size="13" font-weight="800" class="t">HDMI</text><rect x="520" y="50" width="180" height="110" rx="8" fill="#1f2937"/><rect x="530" y="60" width="160" height="90" rx="3" fill="#2a0040"/><polygon points="595,85 595,125 630,105" fill="#f8fafc"/><text x="610" y="182" text-anchor="middle" font-size="13" class="tm">TV</text><rect x="305" y="170" width="60" height="40" rx="8" fill="#334155"/><text x="335" y="195" text-anchor="middle" font-size="12" fill="#fff">phone</text><path d="M335 170 V150" stroke="#00f0ff" stroke-width="3" class="flow"/><text x="372" y="166" font-size="12" class="tm">remote commands (Wi-Fi)</text></g></svg><span class="rp-badge">Cinema</span></div><div class="rp-cap"><p>The Pi reads a video from a file or from your network. It decodes the video and sends the picture and the sound to the TV through HDMI. A phone app on the same network can operate as the remote control.</p></div></figure></div></div><div class="rp-grid"><article class="rp-card" id="p-sensehat-scratch-mp3-player" style="--gc:#ff2e63" data-lv="2" data-b="pi" data-g="media" data-x="1" data-s="sense hat music player tilt and push the sense hat to change the track and the volume. the led matrix shows a light show. motion as an input media in scratch sense hat. speakers or headphones are optional. the page says that a zero does not work. media centre"><div class="rp-art"><img src="/images/raspberry-pi-top-50/sensehat-scratch-mp3-player.svg" width="360" height="240" loading="lazy" decoding="async" alt="Illustration for Sense HAT music player"><span class="rp-num">#30</span></div><div class="rp-body"><div class="rp-tags"><span class="rp-tag lv2">Intermediate</span><span class="rp-tag">Raspberry Pi</span></div><h5>Sense HAT music player</h5><p class="rp-s">Tilt and push the Sense HAT to change the track and the volume. The LED matrix shows a light show.</p><p class="rp-learn"><b>You learn:</b> Motion as an input, Media in Scratch</p><details class="rp-parts"><summary>Parts you need</summary><p>Sense HAT. Speakers or headphones are optional. The page says that a Zero does not work.</p></details><div class="rp-go"><a href="https://projects.raspberrypi.org/en/projects/sensehat-scratch-mp3-player" target="_blank" rel="noopener noreferrer">Open the guide ↗</a><span class="rp-src">Raspberry Pi Foundation projects</span></div></div></article><article class="rp-card" id="p-video-player-htpc-media-centre" style="--gc:#ff2e63" data-lv="1" data-b="pi" data-g="media" data-x="1" data-s="video player: htpc media centre install osmc and kodi to make a media player for your tv. play a video file or a stream. media centre software a phone as a remote hdmi display or tv, keyboard, usb flash drive with a test video. a phone can be the remote. media centre"><div class="rp-art"><img src="/images/raspberry-pi-top-50/video-player-htpc-media-centre.svg" width="360" height="240" loading="lazy" decoding="async" alt="Illustration for Video player: HTPC media centre"><span class="rp-num">#31</span></div><div class="rp-body"><div class="rp-tags"><span class="rp-tag lv1">Beginner</span><span class="rp-tag">Raspberry Pi</span></div><h5>Video player: HTPC media centre</h5><p class="rp-s">Install OSMC and Kodi to make a media player for your TV. Play a video file or a stream.</p><p class="rp-learn"><b>You learn:</b> Media centre software, A phone as a remote</p><details class="rp-parts"><summary>Parts you need</summary><p>HDMI display or TV, keyboard, USB flash drive with a test video. A phone can be the remote.</p></details><div class="rp-go"><a href="https://magazine.raspberrypi.com/articles/video-player-htpc-media-centre" target="_blank" rel="noopener noreferrer">Open the guide ↗</a><span class="rp-src">Raspberry Pi Official Magazine</span></div></div></article></div></div></div><h3 id="grp-sensing">Home sensing (2)</h3><div class="not-prose rp-wrap"><div class="rp-group" data-g="sensing"><p class="rp-gintro">A sensor measures the room or the weather. The Pi reads the value and does an action.</p><div class="rp-concepts" data-g="sensing"><p class="rp-kicker">Learn the idea first</p><div class="rp-cgrid"><figure style="--neon:#ff6b00;--neon2:#fff01f;--sbg:radial-gradient(circle at 10% 50%,rgba(255,107,0,.25),transparent 40%),linear-gradient(90deg,#000814,#001a33);" data-theme="Heat vision" class="rp-fig neon" id="fig-pir"><h4>How a motion sensor sees a person</h4><p class="rp-sub">The person moves through the zones of the sensor.</p><div class="rp-stage"><svg viewBox="0 0 720 220" role="img" aria-label="A PIR sensor sees heat move between zones and starts the camera"><defs><filter id="ng-fig-pir" x="-10%" y="-10%" width="120%" height="120%"><feGaussianBlur in="SourceGraphic" stdDeviation="2.4" result="b"/><feMerge><feMergeNode in="b"/><feMergeNode in="SourceGraphic"/></feMerge></filter></defs><g filter="url(#ng-fig-pir)"><path d="M80 110 L560 20 L560 56 Z" fill="#ff6b00" opacity=".13"/><path d="M80 110 L560 56 L560 92 Z" fill="#ff2e00" opacity=".13"/><path d="M80 110 L560 92 L560 128 Z" fill="#ff6b00" opacity=".13"/><path d="M80 110 L560 128 L560 164 Z" fill="#ff2e00" opacity=".13"/><path d="M80 110 L560 164 L560 200 Z" fill="#ff6b00" opacity=".13"/><rect x="40" y="88" width="44" height="44" rx="6" fill="#0b5d3b"/><path d="M84 92 a20 20 0 0 1 0 36 Z" fill="#f8fafc"/><text x="62" y="152" text-anchor="middle" font-size="12" class="tm">PIR</text><g><circle cx="0" cy="-34" r="11" fill="#fff01f"/><path d="M-16 20 V-10 a16 16 0 0 1 32 0 V20 Z" fill="#fff01f"/><animateTransform attributeName="transform" type="translate" values="420 200;420 40;420 200" dur="7s" repeatCount="indefinite"/></g><g opacity="0"><rect x="590" y="40" width="110" height="34" rx="17" fill="#ff2e63"/><text x="645" y="62" text-anchor="middle" font-size="14" font-weight="800" fill="#fff">Motion!</text><animate attributeName="opacity" values="0;1;0;1;0;1;0;1;0" keyTimes="0;.12;.2;.32;.42;.58;.68;.82;1" dur="7s" repeatCount="indefinite"/></g><rect x="600" y="100" width="90" height="60" rx="8" fill="#334155"/><circle cx="645" cy="130" r="16" fill="#0f172a" stroke="#64748b" stroke-width="3"/><circle cx="680" cy="110" r="5" fill="#ff2e63"><animate attributeName="opacity" values="0;1;0;1;0;1;0;1;0" keyTimes="0;.12;.2;.32;.42;.58;.68;.82;1" dur="7s" repeatCount="indefinite"/></circle><text x="645" y="182" text-anchor="middle" font-size="12" class="tm">camera records</text></g></svg><span class="rp-badge">Heat vision</span></div><div class="rp-cap"><p>A<b>PIR</b> (passive infrared) sensor does not send a beam. It detects the heat of a body. Its lens divides the room into zones. When heat moves from one zone to the next zone, the sensor sets its output pin HIGH. The program then starts the camera or an alarm. The parent detector and the Santa detector use this method.</p></div></figure></div></div><div class="rp-grid"><article class="rp-card" id="p-parent-detector" style="--gc:#00f0ff" data-lv="1" data-b="pi" data-g="sensing" data-x="1" data-s="the parent detector a motion sensor starts the camera. the pi records a video clip when a person comes into the room. pir trigger record video on an event camera module, pir sensor, socket-to-socket jumper wires. home sensing"><div class="rp-art"><img src="/images/raspberry-pi-top-50/parent-detector.svg" width="360" height="240" loading="lazy" decoding="async" alt="Illustration for The parent detector"><span class="rp-num">#32</span></div><div class="rp-body"><div class="rp-tags"><span class="rp-tag lv1">Beginner</span><span class="rp-tag">Raspberry Pi</span></div><h5>The parent detector</h5><p class="rp-s">A motion sensor starts the camera. The Pi records a video clip when a person comes into the room.</p><p class="rp-learn"><b>You learn:</b> PIR trigger, Record video on an event</p><details class="rp-parts"><summary>Parts you need</summary><p>Camera Module, PIR sensor, socket-to-socket jumper wires.</p></details><div class="rp-go"><a href="https://projects.raspberrypi.org/en/projects/parent-detector" target="_blank" rel="noopener noreferrer">Open the guide ↗</a><span class="rp-src">Raspberry Pi Foundation projects</span></div></div></article><article class="rp-card" id="p-build-your-own-weather-station" style="--gc:#00f0ff" data-lv="3" data-b="pi" data-g="sensing" data-x="1" data-s="build your own weather station record the pressure, temperature, and humidity. optional gauges record wind and rain. use sensors that can stay outdoors. i2c sensors data logs an outdoor build bme280, ds18b20 probe, resistors, breadboard. optional: wind and rain gauges and an mcp3008. home sensing"><div class="rp-art"><img src="/images/raspberry-pi-top-50/build-your-own-weather-station.svg" width="360" height="240" loading="lazy" decoding="async" alt="Illustration for Build your own weather station"><span class="rp-num">#33</span></div><div class="rp-body"><div class="rp-tags"><span class="rp-tag lv3">Advanced</span><span class="rp-tag">Raspberry Pi</span></div><h5>Build your own weather station</h5><p class="rp-s">Record the pressure, temperature, and humidity. Optional gauges record wind and rain. Use sensors that can stay outdoors.</p><p class="rp-learn"><b>You learn:</b> I2C sensors, Data logs, An outdoor build</p><details class="rp-parts"><summary>Parts you need</summary><p>BME280, DS18B20 probe, resistors, breadboard. Optional: wind and rain gauges and an MCP3008.</p></details><div class="rp-go"><a href="https://projects.raspberrypi.org/en/projects/build-your-own-weather-station" target="_blank" rel="noopener noreferrer">Open the guide ↗</a><span class="rp-src">Raspberry Pi Foundation projects</span></div></div></article></div></div></div><h3 id="grp-robots">Robots (6)</h3><div class="not-prose rp-wrap"><div class="rp-group" data-g="robots"><p class="rp-gintro">These projects drive motors. Some robots use sensors to steer without your help.</p><div class="rp-concepts" data-g="robots"><p class="rp-kicker">Learn the idea first</p><div class="rp-cgrid"><figure style="--neon:#39ff14;--neon2:#ff6b00;--sbg:conic-gradient(#111 25%,#1b1b1b 0 50%,#111 0 75%,#1b1b1b 0) 0 0/28px 28px;--sfg:#39ff14;" data-theme="Racetrack" class="rp-fig neon" id="fig-line"><h4>How a line-following robot decides</h4><p class="rp-sub">Select a sensor state. See the action.</p><div class="rp-stage"><svg viewBox="0 0 720 240" role="img" aria-label="A robot with two line sensors decides which way to turn"><defs><filter id="ng-fig-line" x="-10%" y="-10%" width="120%" height="120%"><feGaussianBlur in="SourceGraphic" stdDeviation="2.4" result="b"/><feMerge><feMergeNode in="b"/><feMergeNode in="SourceGraphic"/></feMerge></filter></defs><g filter="url(#ng-fig-line)"><rect x="40" y="20" width="300" height="200" rx="14" class="pn"/><rect id="lf-line" x="175" y="20" width="30" height="200" fill="var(--fg)" opacity=".85" style="transition:x .4s"/><g transform="translate(190 130)"><rect x="-60" y="-50" width="120" height="100" rx="14" fill="#ff6b00" opacity=".92"/><rect x="-74" y="-30" width="14" height="44" rx="4" fill="#000"/><rect x="60" y="-30" width="14" height="44" rx="4" fill="#000"/><circle id="lf-sl" cx="-28" cy="-56" r="10" fill="#334155" stroke="#fff" stroke-width="2"/><circle id="lf-sr" cx="28" cy="-56" r="10" fill="#334155" stroke="#fff" stroke-width="2"/><text x="-28" y="-74" text-anchor="middle" font-size="12" class="t">L</text><text x="28" y="-74" text-anchor="middle" font-size="12" class="t">R</text></g><g id="lf-arrow" transform="translate(530 120)" style="transition:transform .4s"><path d="M0 -60 L26 -26 H10 V50 H-10 V-26 H-26 Z" class="acc"/></g><text id="lf-act" x="530" y="210" text-anchor="middle" font-size="18" font-weight="800" class="t">Go forward</text></g></svg><span class="rp-badge">Racetrack</span></div><div class="rp-ctrl"><button class="rp-btn on" data-lf="0">Line between the sensors</button><button class="rp-btn" data-lf="1">Left sensor sees the line</button><button class="rp-btn" data-lf="2">Right sensor sees the line</button><button class="rp-btn" data-lf="3">Both sensors see the line</button></div><div class="rp-cap"><p>Each sensor tells the Pi one thing: "I see the line" or "I do not see the line". The program uses a small rule table to steer. This is a<b>feedback loop</b>. The robot reads the sensors, corrects its direction, and reads the sensors again, many times each second. This table shows a common rule set. Your project can use different rules.</p></div></figure></div></div><div class="rp-grid"><article class="rp-card" id="p-build-a-buggy" style="--gc:#ff6b00" data-lv="3" data-b="pi" data-g="robots" data-x="1" data-s="build a robot buggy assemble a chassis with two motors. drive it with short python commands. motor controller robot movement motor controller, two 3 to 6 v dc motors, wheels, aa battery holder and four aa cells, ball caster, jumper leads, usb power bank. robots"><div class="rp-art"><img src="/images/raspberry-pi-top-50/build-a-buggy.svg" width="360" height="240" loading="lazy" decoding="async" alt="Illustration for Build a robot buggy"><span class="rp-num">#34</span></div><div class="rp-body"><div class="rp-tags"><span class="rp-tag lv3">Advanced</span><span class="rp-tag">Raspberry Pi</span></div><h5>Build a robot buggy</h5><p class="rp-s">Assemble a chassis with two motors. Drive it with short Python commands.</p><p class="rp-learn"><b>You learn:</b> Motor controller, Robot movement</p><details class="rp-parts"><summary>Parts you need</summary><p>Motor controller, two 3 to 6 V DC motors, wheels, AA battery holder and four AA cells, ball caster, jumper leads, USB power bank.</p></details><div class="rp-go"><a href="https://projects.raspberrypi.org/en/projects/build-a-buggy" target="_blank" rel="noopener noreferrer">Open the guide ↗</a><span class="rp-src">Raspberry Pi Foundation projects</span></div></div></article><article class="rp-card" id="p-rpi-python-line-following" style="--gc:#ff6b00" data-lv="3" data-b="pi" data-g="robots" data-x="1" data-s="build a line-following robot add two line sensors to your buggy. the buggy then follows a tape track without your help. sensor feedback loop turn logic a finished buggy from the project above, two line sensors, jumper leads, solder, tape. robots"><div class="rp-art"><img src="/images/raspberry-pi-top-50/rpi-python-line-following.svg" width="360" height="240" loading="lazy" decoding="async" alt="Illustration for Build a line-following robot"><span class="rp-num">#35</span></div><div class="rp-body"><div class="rp-tags"><span class="rp-tag lv3">Advanced</span><span class="rp-tag">Raspberry Pi</span></div><h5>Build a line-following robot</h5><p class="rp-s">Add two line sensors to your buggy. The buggy then follows a tape track without your help.</p><p class="rp-learn"><b>You learn:</b> Sensor feedback loop, Turn logic</p><details class="rp-parts"><summary>Parts you need</summary><p>A finished buggy from the project above, two line sensors, jumper leads, solder, tape.</p></details><div class="rp-go"><a href="https://projects.raspberrypi.org/en/projects/rpi-python-line-following" target="_blank" rel="noopener noreferrer">Open the guide ↗</a><span class="rp-src">Raspberry Pi Foundation projects</span></div></div></article><article class="rp-card" id="p-explorer-hat-buggy" style="--gc:#ff6b00" data-lv="2" data-b="pi" data-g="robots" data-x="1" data-s="explorer hat buggy make a simpler two-wheel robot with an explorer hat. drive it from a different computer. hat add-on boards remote drive explorer hat, four jumper leads, two motors, two wheels, usb power pack. robots"><div class="rp-art"><img src="/images/raspberry-pi-top-50/explorer-hat-buggy.svg" width="360" height="240" loading="lazy" decoding="async" alt="Illustration for Explorer HAT buggy"><span class="rp-num">#36</span></div><div class="rp-body"><div class="rp-tags"><span class="rp-tag lv2">Intermediate</span><span class="rp-tag">Raspberry Pi</span></div><h5>Explorer HAT buggy</h5><p class="rp-s">Make a simpler two-wheel robot with an Explorer HAT. Drive it from a different computer.</p><p class="rp-learn"><b>You learn:</b> HAT add-on boards, Remote drive</p><details class="rp-parts"><summary>Parts you need</summary><p>Explorer HAT, four jumper leads, two motors, two wheels, USB power pack.</p></details><div class="rp-go"><a href="https://projects.raspberrypi.org/en/projects/explorer-hat-buggy" target="_blank" rel="noopener noreferrer">Open the guide ↗</a><span class="rp-src">Raspberry Pi Foundation projects</span></div></div></article><article class="rp-card" id="p-lego-robot-car" style="--gc:#ff6b00" data-lv="2" data-b="pi" data-g="robots" data-x="1" data-s="lego remote-controlled car use a phone and bluetooth to steer two lego motors on a build hat. build hat bluetooth control build hat, two lego technic motors, lego wheels, an android phone or tablet, aa batteries. robots"><div class="rp-art"><img src="/images/raspberry-pi-top-50/lego-robot-car.svg" width="360" height="240" loading="lazy" decoding="async" alt="Illustration for LEGO remote-controlled car"><span class="rp-num">#37</span></div><div class="rp-body"><div class="rp-tags"><span class="rp-tag lv2">Intermediate</span><span class="rp-tag">Raspberry Pi</span></div><h5>LEGO remote-controlled car</h5><p class="rp-s">Use a phone and Bluetooth to steer two LEGO motors on a Build HAT.</p><p class="rp-learn"><b>You learn:</b> Build HAT, Bluetooth control</p><details class="rp-parts"><summary>Parts you need</summary><p>Build HAT, two LEGO Technic motors, LEGO wheels, an Android phone or tablet, AA batteries.</p></details><div class="rp-go"><a href="https://projects.raspberrypi.org/en/projects/lego-robot-car" target="_blank" rel="noopener noreferrer">Open the guide ↗</a><span class="rp-src">Raspberry Pi Foundation projects</span></div></div></article><article class="rp-card" id="p-lego-robot-face" style="--gc:#ff6b00" data-lv="2" data-b="pi" data-g="robots" data-x="1" data-s="lego robot face a camera and a machine-learning model detect objects. lego motors then move the eyebrows and the mouth. machine learning on the pi motors that react build hat, camera module and 30 cm ribbon, lego technic motors, mini breadboard, jumper wires, two 8×8 led matrices. robots"><div class="rp-art"><img src="/images/raspberry-pi-top-50/lego-robot-face.svg" width="360" height="240" loading="lazy" decoding="async" alt="Illustration for LEGO robot face"><span class="rp-num">#38</span></div><div class="rp-body"><div class="rp-tags"><span class="rp-tag lv2">Intermediate</span><span class="rp-tag">Raspberry Pi</span></div><h5>LEGO robot face</h5><p class="rp-s">A camera and a machine-learning model detect objects. LEGO motors then move the eyebrows and the mouth.</p><p class="rp-learn"><b>You learn:</b> Machine learning on the Pi, Motors that react</p><details class="rp-parts"><summary>Parts you need</summary><p>Build HAT, Camera Module and 30 cm ribbon, LEGO Technic motors, mini breadboard, jumper wires, two 8×8 LED matrices.</p></details><div class="rp-go"><a href="https://projects.raspberrypi.org/en/projects/lego-robot-face" target="_blank" rel="noopener noreferrer">Open the guide ↗</a><span class="rp-src">Raspberry Pi Foundation projects</span></div></div></article><article class="rp-card" id="p-remote-control-buggy" style="--gc:#ff6b00" data-lv="2" data-b="pi" data-g="robots" data-x="1" data-s="remotely control your buggy add a remote control to a buggy that you built before. one option uses an android phone. remote input options a buggy that operates. the remote parts change with the option that you select. robots"><div class="rp-art"><img src="/images/raspberry-pi-top-50/remote-control-buggy.svg" width="360" height="240" loading="lazy" decoding="async" alt="Illustration for Remotely control your buggy"><span class="rp-num">#39</span></div><div class="rp-body"><div class="rp-tags"><span class="rp-tag lv2">Intermediate</span><span class="rp-tag">Raspberry Pi</span></div><h5>Remotely control your buggy</h5><p class="rp-s">Add a remote control to a buggy that you built before. One option uses an Android phone.</p><p class="rp-learn"><b>You learn:</b> Remote input options</p><details class="rp-parts"><summary>Parts you need</summary><p>A buggy that operates. The remote parts change with the option that you select.</p></details><div class="rp-go"><a href="https://projects.raspberrypi.org/en/projects/remote-control-buggy" target="_blank" rel="noopener noreferrer">Open the guide ↗</a><span class="rp-src">Raspberry Pi Foundation projects</span></div></div></article></div></div></div><h3 id="grp-games">Games and retro (6)</h3><div class="not-prose rp-wrap"><div class="rp-group" data-g="games"><p class="rp-gintro">Make games on the Sense HAT, in the terminal, or with LEGO parts. Play old games on a handheld.</p><div class="rp-concepts" data-g="games"><p class="rp-kicker">Learn the idea first</p><div class="rp-cgrid"><figure style="--neon:#ff10f0;--neon2:#00f0ff;--sbg:repeating-linear-gradient(0deg,rgba(0,0,0,.35) 0 2px,transparent 2px 4px),radial-gradient(ellipse at center,#1d0838 0%,#000 85%);" data-theme="CRT arcade" class="rp-fig neon" id="fig-game"><h4>The game loop</h4><p class="rp-sub">The highlighted step runs now. The grid shows the result.</p><div class="rp-stage"><svg viewBox="0 0 720 232" role="img" aria-label="A game loop repeats four steps. An 8 by 8 LED grid shows a Pong game."><defs><filter id="ng-fig-game" x="-10%" y="-10%" width="120%" height="120%"><feGaussianBlur in="SourceGraphic" stdDeviation="2.4" result="b"/><feMerge><feMergeNode in="b"/><feMergeNode in="SourceGraphic"/></feMerge></filter></defs><g filter="url(#ng-fig-game)"><circle cx="150" cy="115" r="70" class="ln" stroke-width="2" stroke-dasharray="4 6"/><g class="gl-s" data-k="0"><rect x="88.0" y="15.0" width="124" height="36" rx="18" class="bx" stroke-width="2"/><text x="150.0" y="38.0" text-anchor="middle" font-size="14" font-weight="800" class="t">Read input</text></g><g class="gl-s" data-k="1"><rect x="180.0" y="97.0" width="124" height="36" rx="18" class="bx" stroke-width="2"/><text x="242.0" y="120.0" text-anchor="middle" font-size="14" font-weight="800" class="t">Move objects</text></g><g class="gl-s" data-k="2"><rect x="88.0" y="179.0" width="124" height="36" rx="18" class="bx" stroke-width="2"/><text x="150.0" y="202.0" text-anchor="middle" font-size="14" font-weight="800" class="t">Check hits</text></g><g class="gl-s" data-k="3"><rect x="-4.0" y="97.00000000000001" width="124" height="36" rx="18" class="bx" stroke-width="2"/><text x="58.0" y="120.00000000000001" text-anchor="middle" font-size="14" font-weight="800" class="t">Draw</text></g><rect x="434" y="0" width="236" height="232" rx="10" fill="#07000f"/><rect class="gl-c" data-i="0" x="440" y="6" width="24" height="24" rx="4" fill="#1a0533"/><rect class="gl-c" data-i="1" x="468" y="6" width="24" height="24" rx="4" fill="#1a0533"/><rect class="gl-c" data-i="2" x="496" y="6" width="24" height="24" rx="4" fill="#1a0533"/><rect class="gl-c" data-i="3" x="524" y="6" width="24" height="24" rx="4" fill="#1a0533"/><rect class="gl-c" data-i="4" x="552" y="6" width="24" height="24" rx="4" fill="#1a0533"/><rect class="gl-c" data-i="5" x="580" y="6" width="24" height="24" rx="4" fill="#1a0533"/><rect class="gl-c" data-i="6" x="608" y="6" width="24" height="24" rx="4" fill="#1a0533"/><rect class="gl-c" data-i="7" x="636" y="6" width="24" height="24" rx="4" fill="#1a0533"/><rect class="gl-c" data-i="8" x="440" y="34" width="24" height="24" rx="4" fill="#1a0533"/><rect class="gl-c" data-i="9" x="468" y="34" width="24" height="24" rx="4" fill="#1a0533"/><rect class="gl-c" data-i="10" x="496" y="34" width="24" height="24" rx="4" fill="#1a0533"/><rect class="gl-c" data-i="11" x="524" y="34" width="24" height="24" rx="4" fill="#1a0533"/><rect class="gl-c" data-i="12" x="552" y="34" width="24" height="24" rx="4" fill="#1a0533"/><rect class="gl-c" data-i="13" x="580" y="34" width="24" height="24" rx="4" fill="#1a0533"/><rect class="gl-c" data-i="14" x="608" y="34" width="24" height="24" rx="4" fill="#1a0533"/><rect class="gl-c" data-i="15" x="636" y="34" width="24" height="24" rx="4" fill="#1a0533"/><rect class="gl-c" data-i="16" x="440" y="62" width="24" height="24" rx="4" fill="#1a0533"/><rect class="gl-c" data-i="17" x="468" y="62" width="24" height="24" rx="4" fill="#1a0533"/><rect class="gl-c" data-i="18" x="496" y="62" width="24" height="24" rx="4" fill="#1a0533"/><rect class="gl-c" data-i="19" x="524" y="62" width="24" height="24" rx="4" fill="#1a0533"/><rect class="gl-c" data-i="20" x="552" y="62" width="24" height="24" rx="4" fill="#1a0533"/><rect class="gl-c" data-i="21" x="580" y="62" width="24" height="24" rx="4" fill="#1a0533"/><rect class="gl-c" data-i="22" x="608" y="62" width="24" height="24" rx="4" fill="#1a0533"/><rect class="gl-c" data-i="23" x="636" y="62" width="24" height="24" rx="4" fill="#1a0533"/><rect class="gl-c" data-i="24" x="440" y="90" width="24" height="24" rx="4" fill="#1a0533"/><rect class="gl-c" data-i="25" x="468" y="90" width="24" height="24" rx="4" fill="#1a0533"/><rect class="gl-c" data-i="26" x="496" y="90" width="24" height="24" rx="4" fill="#1a0533"/><rect class="gl-c" data-i="27" x="524" y="90" width="24" height="24" rx="4" fill="#1a0533"/><rect class="gl-c" data-i="28" x="552" y="90" width="24" height="24" rx="4" fill="#1a0533"/><rect class="gl-c" data-i="29" x="580" y="90" width="24" height="24" rx="4" fill="#1a0533"/><rect class="gl-c" data-i="30" x="608" y="90" width="24" height="24" rx="4" fill="#1a0533"/><rect class="gl-c" data-i="31" x="636" y="90" width="24" height="24" rx="4" fill="#1a0533"/><rect class="gl-c" data-i="32" x="440" y="118" width="24" height="24" rx="4" fill="#1a0533"/><rect class="gl-c" data-i="33" x="468" y="118" width="24" height="24" rx="4" fill="#1a0533"/><rect class="gl-c" data-i="34" x="496" y="118" width="24" height="24" rx="4" fill="#1a0533"/><rect class="gl-c" data-i="35" x="524" y="118" width="24" height="24" rx="4" fill="#1a0533"/><rect class="gl-c" data-i="36" x="552" y="118" width="24" height="24" rx="4" fill="#1a0533"/><rect class="gl-c" data-i="37" x="580" y="118" width="24" height="24" rx="4" fill="#1a0533"/><rect class="gl-c" data-i="38" x="608" y="118" width="24" height="24" rx="4" fill="#1a0533"/><rect class="gl-c" data-i="39" x="636" y="118" width="24" height="24" rx="4" fill="#1a0533"/><rect class="gl-c" data-i="40" x="440" y="146" width="24" height="24" rx="4" fill="#1a0533"/><rect class="gl-c" data-i="41" x="468" y="146" width="24" height="24" rx="4" fill="#1a0533"/><rect class="gl-c" data-i="42" x="496" y="146" width="24" height="24" rx="4" fill="#1a0533"/><rect class="gl-c" data-i="43" x="524" y="146" width="24" height="24" rx="4" fill="#1a0533"/><rect class="gl-c" data-i="44" x="552" y="146" width="24" height="24" rx="4" fill="#1a0533"/><rect class="gl-c" data-i="45" x="580" y="146" width="24" height="24" rx="4" fill="#1a0533"/><rect class="gl-c" data-i="46" x="608" y="146" width="24" height="24" rx="4" fill="#1a0533"/><rect class="gl-c" data-i="47" x="636" y="146" width="24" height="24" rx="4" fill="#1a0533"/><rect class="gl-c" data-i="48" x="440" y="174" width="24" height="24" rx="4" fill="#1a0533"/><rect class="gl-c" data-i="49" x="468" y="174" width="24" height="24" rx="4" fill="#1a0533"/><rect class="gl-c" data-i="50" x="496" y="174" width="24" height="24" rx="4" fill="#1a0533"/><rect class="gl-c" data-i="51" x="524" y="174" width="24" height="24" rx="4" fill="#1a0533"/><rect class="gl-c" data-i="52" x="552" y="174" width="24" height="24" rx="4" fill="#1a0533"/><rect class="gl-c" data-i="53" x="580" y="174" width="24" height="24" rx="4" fill="#1a0533"/><rect class="gl-c" data-i="54" x="608" y="174" width="24" height="24" rx="4" fill="#1a0533"/><rect class="gl-c" data-i="55" x="636" y="174" width="24" height="24" rx="4" fill="#1a0533"/><rect class="gl-c" data-i="56" x="440" y="202" width="24" height="24" rx="4" fill="#1a0533"/><rect class="gl-c" data-i="57" x="468" y="202" width="24" height="24" rx="4" fill="#1a0533"/><rect class="gl-c" data-i="58" x="496" y="202" width="24" height="24" rx="4" fill="#1a0533"/><rect class="gl-c" data-i="59" x="524" y="202" width="24" height="24" rx="4" fill="#1a0533"/><rect class="gl-c" data-i="60" x="552" y="202" width="24" height="24" rx="4" fill="#1a0533"/><rect class="gl-c" data-i="61" x="580" y="202" width="24" height="24" rx="4" fill="#1a0533"/><rect class="gl-c" data-i="62" x="608" y="202" width="24" height="24" rx="4" fill="#1a0533"/><rect class="gl-c" data-i="63" x="636" y="202" width="24" height="24" rx="4" fill="#1a0533"/></g></svg><span class="rp-badge">CRT arcade</span></div><div class="rp-cap"><p>Every game on the Sense HAT uses a<b>game loop</b>. The loop reads the joystick or the tilt sensor. It moves the ball. It checks for hits on the bat or the wall. Then it draws the next picture on the LED grid. The loop repeats many times each second. Sense HAT Pong, Flappy Astronaut, and the LEGO game controller all use this idea.</p></div></figure></div></div><div class="rp-grid"><article class="rp-card" id="p-sense-hat-pong" style="--gc:#2979ff" data-lv="2" data-b="pi" data-g="games" data-x="0" data-s="sense hat pong play a one-player pong game on the sense hat led grid. you can also use the on-screen emulator. a game loop collision checks sense hat, or none if you use the emulator. games and retro"><div class="rp-art"><img src="/images/raspberry-pi-top-50/sense-hat-pong.svg" width="360" height="240" loading="lazy" decoding="async" alt="Illustration for Sense HAT Pong"><span class="rp-num">#40</span><span class="rp-arch" title="The page is still online but not in the main catalogue">Archived</span></div><div class="rp-body"><div class="rp-tags"><span class="rp-tag lv2">Intermediate</span><span class="rp-tag">Raspberry Pi</span><span class="rp-tag">No extra parts</span></div><h5>Sense HAT Pong</h5><p class="rp-s">Play a one-player Pong game on the Sense HAT LED grid. You can also use the on-screen emulator.</p><p class="rp-learn"><b>You learn:</b> A game loop, Collision checks</p><details class="rp-parts"><summary>Parts you need</summary><p>Sense HAT, or none if you use the emulator.</p></details><div class="rp-go"><a href="https://projects.raspberrypi.org/en/projects/sense-hat-pong" target="_blank" rel="noopener noreferrer">Open the guide ↗</a><span class="rp-src">Raspberry Pi Foundation projects</span></div></div></article><article class="rp-card" id="p-flappy-astronaut" style="--gc:#2979ff" data-lv="3" data-b="pi" data-g="games" data-x="0" data-s="flappy astronaut tilt the sense hat to fly a character through gaps in a wall. tilt as an input scroll a game world sense hat, or a computer with the emulator. games and retro"><div class="rp-art"><img src="/images/raspberry-pi-top-50/flappy-astronaut.svg" width="360" height="240" loading="lazy" decoding="async" alt="Illustration for Flappy Astronaut"><span class="rp-num">#41</span></div><div class="rp-body"><div class="rp-tags"><span class="rp-tag lv3">Advanced</span><span class="rp-tag">Raspberry Pi</span><span class="rp-tag">No extra parts</span></div><h5>Flappy Astronaut</h5><p class="rp-s">Tilt the Sense HAT to fly a character through gaps in a wall.</p><p class="rp-learn"><b>You learn:</b> Tilt as an input, Scroll a game world</p><details class="rp-parts"><summary>Parts you need</summary><p>Sense HAT, or a computer with the emulator.</p></details><div class="rp-go"><a href="https://projects.raspberrypi.org/en/projects/flappy-astronaut" target="_blank" rel="noopener noreferrer">Open the guide ↗</a><span class="rp-src">Raspberry Pi Foundation projects</span></div></div></article><article class="rp-card" id="p-pacman-terminal" style="--gc:#2979ff" data-lv="1" data-b="pi" data-g="games" data-x="0" data-s="pac-man treasure hunt on the terminal follow a guided hunt in the terminal to find the ghosts. you do not need extra boards. terminal commands files and folders none. games and retro"><div class="rp-art"><img src="/images/raspberry-pi-top-50/pacman-terminal.svg" width="360" height="240" loading="lazy" decoding="async" alt="Illustration for Pac-Man treasure hunt on the terminal"><span class="rp-num">#42</span></div><div class="rp-body"><div class="rp-tags"><span class="rp-tag lv1">Beginner</span><span class="rp-tag">Raspberry Pi</span><span class="rp-tag">No extra parts</span></div><h5>Pac-Man treasure hunt on the terminal</h5><p class="rp-s">Follow a guided hunt in the terminal to find the ghosts. You do not need extra boards.</p><p class="rp-learn"><b>You learn:</b> Terminal commands, Files and folders</p><details class="rp-parts"><summary>Parts you need</summary><p>None.</p></details><div class="rp-go"><a href="https://projects.raspberrypi.org/en/projects/pacman-terminal" target="_blank" rel="noopener noreferrer">Open the guide ↗</a><span class="rp-src">Raspberry Pi Foundation projects</span></div></div></article><article class="rp-card" id="p-lego-game-controller" style="--gc:#2979ff" data-lv="2" data-b="pi" data-g="games" data-x="1" data-s="lego game controller turn the shaft of a lego motor to move the paddle in a pong game on the screen. a motor as a position sensor build hat and one or more lego technic motors. a buzzer is optional. games and retro"><div class="rp-art"><img src="/images/raspberry-pi-top-50/lego-game-controller.svg" width="360" height="240" loading="lazy" decoding="async" alt="Illustration for LEGO game controller"><span class="rp-num">#43</span></div><div class="rp-body"><div class="rp-tags"><span class="rp-tag lv2">Intermediate</span><span class="rp-tag">Raspberry Pi</span></div><h5>LEGO game controller</h5><p class="rp-s">Turn the shaft of a LEGO motor to move the paddle in a Pong game on the screen.</p><p class="rp-learn"><b>You learn:</b> A motor as a position sensor</p><details class="rp-parts"><summary>Parts you need</summary><p>Build HAT and one or more LEGO Technic motors. A buzzer is optional.</p></details><div class="rp-go"><a href="https://projects.raspberrypi.org/en/projects/lego-game-controller" target="_blank" rel="noopener noreferrer">Open the guide ↗</a><span class="rp-src">Raspberry Pi Foundation projects</span></div></div></article><article class="rp-card" id="p-editor-pixel-pet" style="--gc:#2979ff" data-lv="1" data-b="pi" data-g="games" data-x="1" data-s="pixel pet draw a small pet on the sense hat led matrix. show frames one after the other to make it move. pixel art animation frames sense hat. games and retro"><div class="rp-art"><img src="/images/raspberry-pi-top-50/editor-pixel-pet.svg" width="360" height="240" loading="lazy" decoding="async" alt="Illustration for Pixel pet"><span class="rp-num">#44</span></div><div class="rp-body"><div class="rp-tags"><span class="rp-tag lv1">Beginner</span><span class="rp-tag">Raspberry Pi</span></div><h5>Pixel pet</h5><p class="rp-s">Draw a small pet on the Sense HAT LED matrix. Show frames one after the other to make it move.</p><p class="rp-learn"><b>You learn:</b> Pixel art, Animation frames</p><details class="rp-parts"><summary>Parts you need</summary><p>Sense HAT.</p></details><div class="rp-go"><a href="https://projects.raspberrypi.org/en/projects/editor-pixel-pet" target="_blank" rel="noopener noreferrer">Open the guide ↗</a><span class="rp-src">Raspberry Pi Foundation projects</span></div></div></article><article class="rp-card" id="p-build-a-handheld-console" style="--gc:#2979ff" data-lv="2" data-b="pi" data-g="games" data-x="1" data-s="build a handheld console put a pi into a handheld case with a small screen and real buttons. install retropie to play retro games. retropie game emulators the article uses a retroflag gpi case with a raspberry pi zero, or a piboy dmg. also a microsd card and batteries. games and retro"><div class="rp-art"><img src="/images/raspberry-pi-top-50/build-a-handheld-console.svg" width="360" height="240" loading="lazy" decoding="async" alt="Illustration for Build a handheld console"><span class="rp-num">#45</span></div><div class="rp-body"><div class="rp-tags"><span class="rp-tag lv2">Intermediate</span><span class="rp-tag">Raspberry Pi</span></div><h5>Build a handheld console</h5><p class="rp-s">Put a Pi into a handheld case with a small screen and real buttons. Install RetroPie to play retro games.</p><p class="rp-learn"><b>You learn:</b> RetroPie, Game emulators</p><details class="rp-parts"><summary>Parts you need</summary><p>The article uses a Retroflag GPi Case with a Raspberry Pi Zero, or a PiBoy DMG. Also a microSD card and batteries.</p></details><div class="rp-go"><a href="https://magazine.raspberrypi.com/articles/build-a-handheld-console" target="_blank" rel="noopener noreferrer">Open the guide ↗</a><span class="rp-src">Raspberry Pi Official Magazine</span></div></div></article></div></div></div><h3 id="grp-net">Networking (3)</h3><div class="not-prose rp-wrap"><div class="rp-group" data-g="net"><p class="rp-gintro">The Pi can be a web server or a small cluster on your network.</p><div class="rp-concepts" data-g="net"><p class="rp-kicker">Learn the idea first</p><div class="rp-cgrid"><figure style="--neon:#00f0ff;--neon2:#ff10f0;--sbg:linear-gradient(rgba(0,240,255,.07) 1px,transparent 1px) 0 0/100% 22px,linear-gradient(160deg,#000814,#001d3d);" data-theme="Hacker terminal" class="rp-fig neon" id="fig-web"><h4>What happens when you open a page on your Pi</h4><p class="rp-sub">The request goes right. The answer comes back left.</p><div class="rp-stage"><svg viewBox="0 0 720 220" role="img" aria-label="A browser sends a request to a Flask server on the Pi. The server sends back HTML."><defs><filter id="ng-fig-web" x="-10%" y="-10%" width="120%" height="120%"><feGaussianBlur in="SourceGraphic" stdDeviation="2.4" result="b"/><feMerge><feMergeNode in="b"/><feMergeNode in="SourceGraphic"/></feMerge></filter></defs><g filter="url(#ng-fig-web)"><rect x="20" y="40" width="200" height="140" rx="10" fill="#f8fafc" stroke="#94a3b8" stroke-width="2"/><rect x="20" y="40" width="200" height="24" rx="10" fill="#e2e8f0"/><text x="40" y="57" font-size="11" fill="#334155" class="mono">raspberrypi.local:5000/</text><g opacity="0"><rect x="36" y="80" width="120" height="14" rx="3" fill="#0f172a"/><rect x="36" y="104" width="160" height="8" rx="3" fill="#94a3b8"/><rect x="36" y="120" width="140" height="8" rx="3" fill="#cbd5e1"/><rect x="36" y="142" width="70" height="22" rx="5" fill="#ff10f0"/><animate attributeName="opacity" values="0;0;1;1;0" keyTimes="0;.62;.7;.95;1" dur="5s" repeatCount="indefinite"/></g><text x="120" y="200" text-anchor="middle" font-size="13" class="tm">your browser</text><path d="M220 90 H470 M470 140 H220" class="ln" stroke-width="2" stroke-dasharray="4 6"/><g><rect x="-36" y="-14" width="72" height="28" rx="14" fill="#00f0ff"/><text y="5" text-anchor="middle" font-size="13" font-weight="800" fill="#fff" class="mono">GET /</text><animateTransform attributeName="transform" type="translate" values="260 90;430 90;430 90" keyTimes="0;.3;1" dur="5s" repeatCount="indefinite"/><animate attributeName="opacity" values="1;1;0;0" keyTimes="0;.3;.32;1" dur="5s" repeatCount="indefinite"/></g><g opacity="0"><rect x="-36" y="-14" width="72" height="28" rx="14" fill="#ff10f0"/><text y="5" text-anchor="middle" font-size="13" font-weight="800" fill="#fff" class="mono">HTML</text><animateTransform attributeName="transform" type="translate" values="430 140;430 140;260 140;260 140" keyTimes="0;.4;.65;1" dur="5s" repeatCount="indefinite"/><animate attributeName="opacity" values="0;0;1;1;0;0" keyTimes="0;.38;.4;.64;.66;1" dur="5s" repeatCount="indefinite"/></g><rect x="470" y="30" width="230" height="160" rx="10" fill="#5d00ff"/><text x="585" y="56" text-anchor="middle" font-size="15" font-weight="800" fill="#fff">Raspberry Pi · Flask</text><rect x="484" y="68" width="202" height="108" rx="6" fill="#0b1220"/><text x="496" y="92" font-size="12" fill="#c4b5fd" class="mono">@app.route("/")</text><text x="496" y="112" font-size="12" fill="#e2e8f0" class="mono">def index():</text><text x="496" y="132" font-size="12" fill="#86efac" class="mono">  return render_</text><text x="496" y="152" font-size="12" fill="#86efac" class="mono">    template("i.html")</text></g></svg><span class="rp-badge">Hacker terminal</span></div><div class="rp-cap"><p>A web server waits for<b>requests</b>. Your browser sends a request for a page, for example<code>/</code>. Flask finds the function for that address (a<b>route</b>). The function sends back HTML. The browser then shows the page. In the LAMP project, Apache receives the request, PHP makes the page, and MariaDB stores the data.</p></div></figure><figure style="--neon:#00b3ff;--neon2:#39ff14;--sbg:repeating-linear-gradient(90deg,rgba(0,179,255,.08) 0 2px,transparent 2px 30px),linear-gradient(180deg,#00111f,#000510);" data-theme="Data centre" class="rp-fig neon" id="fig-cluster"><h4>How a cluster shares the work</h4><p class="rp-sub">Yellow blocks are parts of one job.</p><div class="rp-stage"><svg viewBox="0 0 720 230" role="img" aria-label="A client Pi divides a job into parts and sends one part to each worker Pi"><defs><filter id="ng-fig-cluster" x="-10%" y="-10%" width="120%" height="120%"><feGaussianBlur in="SourceGraphic" stdDeviation="2.4" result="b"/><feMerge><feMergeNode in="b"/><feMergeNode in="SourceGraphic"/></feMerge></filter></defs><g filter="url(#ng-fig-cluster)"><rect x="90" y="80" width="120" height="70" rx="10" fill="#ff10f0"/><text x="150" y="112" text-anchor="middle" font-size="14" fill="#fff" font-weight="800">Client Pi</text><text x="150" y="132" text-anchor="middle" font-size="12" fill="#ffd6fb">divides the job</text><rect x="330" y="30" width="80" height="56" rx="8" fill="#003b66"/><text x="370" y="63" text-anchor="middle" font-size="12" fill="#fff" font-weight="700">Pi 1</text><rect x="336" y="72" width="0" height="6" rx="3" fill="#39ff14"><animate attributeName="width" values="0;0;68;68;0" keyTimes="0;0.15;0.55;.9;1" dur="5s" repeatCount="indefinite"/></rect><g><rect x="-10" y="-8" width="20" height="16" rx="3" fill="#fff01f"/><animateTransform attributeName="transform" type="translate" values="150 115;150 115;370 58;370 58" keyTimes="0;.05;0.15;1" dur="5s" repeatCount="indefinite"/><animate attributeName="opacity" values="1;1;0;0" keyTimes="0;0.15;0.17;1" dur="5s" repeatCount="indefinite"/></g><rect x="425" y="30" width="80" height="56" rx="8" fill="#003b66"/><text x="465" y="63" text-anchor="middle" font-size="12" fill="#fff" font-weight="700">Pi 2</text><rect x="431" y="72" width="0" height="6" rx="3" fill="#39ff14"><animate attributeName="width" values="0;0;68;68;0" keyTimes="0;0.17;0.58;.9;1" dur="5s" repeatCount="indefinite"/></rect><g><rect x="-10" y="-8" width="20" height="16" rx="3" fill="#fff01f"/><animateTransform attributeName="transform" type="translate" values="150 115;150 115;465 58;465 58" keyTimes="0;.05;0.17;1" dur="5s" repeatCount="indefinite"/><animate attributeName="opacity" values="1;1;0;0" keyTimes="0;0.17;0.19;1" dur="5s" repeatCount="indefinite"/></g><rect x="520" y="30" width="80" height="56" rx="8" fill="#003b66"/><text x="560" y="63" text-anchor="middle" font-size="12" fill="#fff" font-weight="700">Pi 3</text><rect x="526" y="72" width="0" height="6" rx="3" fill="#39ff14"><animate attributeName="width" values="0;0;68;68;0" keyTimes="0;0.19;0.61;.9;1" dur="5s" repeatCount="indefinite"/></rect><g><rect x="-10" y="-8" width="20" height="16" rx="3" fill="#fff01f"/><animateTransform attributeName="transform" type="translate" values="150 115;150 115;560 58;560 58" keyTimes="0;.05;0.19;1" dur="5s" repeatCount="indefinite"/><animate attributeName="opacity" values="1;1;0;0" keyTimes="0;0.19;0.21;1" dur="5s" repeatCount="indefinite"/></g><rect x="615" y="30" width="80" height="56" rx="8" fill="#003b66"/><text x="655" y="63" text-anchor="middle" font-size="12" fill="#fff" font-weight="700">Pi 4</text><rect x="621" y="72" width="0" height="6" rx="3" fill="#39ff14"><animate attributeName="width" values="0;0;68;68;0" keyTimes="0;0.21;0.64;.9;1" dur="5s" repeatCount="indefinite"/></rect><g><rect x="-10" y="-8" width="20" height="16" rx="3" fill="#fff01f"/><animateTransform attributeName="transform" type="translate" values="150 115;150 115;655 58;655 58" keyTimes="0;.05;0.21;1" dur="5s" repeatCount="indefinite"/><animate attributeName="opacity" values="1;1;0;0" keyTimes="0;0.21;0.23;1" dur="5s" repeatCount="indefinite"/></g><rect x="330" y="130" width="80" height="56" rx="8" fill="#003b66"/><text x="370" y="163" text-anchor="middle" font-size="12" fill="#fff" font-weight="700">Pi 5</text><rect x="336" y="172" width="0" height="6" rx="3" fill="#39ff14"><animate attributeName="width" values="0;0;68;68;0" keyTimes="0;0.23;0.67;.9;1" dur="5s" repeatCount="indefinite"/></rect><g><rect x="-10" y="-8" width="20" height="16" rx="3" fill="#fff01f"/><animateTransform attributeName="transform" type="translate" values="150 115;150 115;370 158;370 158" keyTimes="0;.05;0.23;1" dur="5s" repeatCount="indefinite"/><animate attributeName="opacity" values="1;1;0;0" keyTimes="0;0.23;0.25;1" dur="5s" repeatCount="indefinite"/></g><rect x="425" y="130" width="80" height="56" rx="8" fill="#003b66"/><text x="465" y="163" text-anchor="middle" font-size="12" fill="#fff" font-weight="700">Pi 6</text><rect x="431" y="172" width="0" height="6" rx="3" fill="#39ff14"><animate attributeName="width" values="0;0;68;68;0" keyTimes="0;0.25;0.70;.9;1" dur="5s" repeatCount="indefinite"/></rect><g><rect x="-10" y="-8" width="20" height="16" rx="3" fill="#fff01f"/><animateTransform attributeName="transform" type="translate" values="150 115;150 115;465 158;465 158" keyTimes="0;.05;0.25;1" dur="5s" repeatCount="indefinite"/><animate attributeName="opacity" values="1;1;0;0" keyTimes="0;0.25;0.27;1" dur="5s" repeatCount="indefinite"/></g><rect x="520" y="130" width="80" height="56" rx="8" fill="#003b66"/><text x="560" y="163" text-anchor="middle" font-size="12" fill="#fff" font-weight="700">Pi 7</text><rect x="526" y="172" width="0" height="6" rx="3" fill="#39ff14"><animate attributeName="width" values="0;0;68;68;0" keyTimes="0;0.27;0.73;.9;1" dur="5s" repeatCount="indefinite"/></rect><g><rect x="-10" y="-8" width="20" height="16" rx="3" fill="#fff01f"/><animateTransform attributeName="transform" type="translate" values="150 115;150 115;560 158;560 158" keyTimes="0;.05;0.27;1" dur="5s" repeatCount="indefinite"/><animate attributeName="opacity" values="1;1;0;0" keyTimes="0;0.27;0.29;1" dur="5s" repeatCount="indefinite"/></g><rect x="615" y="130" width="80" height="56" rx="8" fill="#003b66"/><text x="655" y="163" text-anchor="middle" font-size="12" fill="#fff" font-weight="700">Pi 8</text><rect x="621" y="172" width="0" height="6" rx="3" fill="#39ff14"><animate attributeName="width" values="0;0;68;68;0" keyTimes="0;0.29;0.76;.9;1" dur="5s" repeatCount="indefinite"/></rect><g><rect x="-10" y="-8" width="20" height="16" rx="3" fill="#fff01f"/><animateTransform attributeName="transform" type="translate" values="150 115;150 115;655 158;655 158" keyTimes="0;.05;0.29;1" dur="5s" repeatCount="indefinite"/><animate attributeName="opacity" values="1;1;0;0" keyTimes="0;0.29;0.31;1" dur="5s" repeatCount="indefinite"/></g><text x="510" y="222" text-anchor="middle" font-size="13" class="tm">8 workers do their parts at the same time</text></g></svg><span class="rp-badge">Data centre</span></div><div class="rp-cap"><p>A<b>cluster</b> divides one big job into small parts. Each worker computer does one part at the same time. The client collects the results. Eight workers can finish some jobs nearly eight times faster. The OctaPi project uses this method.</p></div></figure></div></div><div class="rp-grid"><article class="rp-card" id="p-python-web-server-with-flask" style="--gc:#00ffc6" data-lv="2" data-b="pi" data-g="net" data-x="0" data-s="build a python web server with flask use flask to serve a small website from the pi. add more than one page and some html. web routes html templates none. use a raspberry pi with the latest raspberry pi os. networking"><div class="rp-art"><img src="/images/raspberry-pi-top-50/python-web-server-with-flask.svg" width="360" height="240" loading="lazy" decoding="async" alt="Illustration for Build a Python web server with Flask"><span class="rp-num">#46</span></div><div class="rp-body"><div class="rp-tags"><span class="rp-tag lv2">Intermediate</span><span class="rp-tag">Raspberry Pi</span><span class="rp-tag">No extra parts</span></div><h5>Build a Python web server with Flask</h5><p class="rp-s">Use Flask to serve a small website from the Pi. Add more than one page and some HTML.</p><p class="rp-learn"><b>You learn:</b> Web routes, HTML templates</p><details class="rp-parts"><summary>Parts you need</summary><p>None. Use a Raspberry Pi with the latest Raspberry Pi OS.</p></details><div class="rp-go"><a href="https://projects.raspberrypi.org/en/projects/python-web-server-with-flask" target="_blank" rel="noopener noreferrer">Open the guide ↗</a><span class="rp-src">Raspberry Pi Foundation projects</span></div></div></article><article class="rp-card" id="p-lamp-web-server-with-wordpress" style="--gc:#00ffc6" data-lv="2" data-b="pi" data-g="net" data-x="0" data-s="build a lamp web server with wordpress install apache, php, and mariadb. then install wordpress and use it on your local network. a web server stack a database none. use a raspberry pi on your network. networking"><div class="rp-art"><img src="/images/raspberry-pi-top-50/lamp-web-server-with-wordpress.svg" width="360" height="240" loading="lazy" decoding="async" alt="Illustration for Build a LAMP web server with WordPress"><span class="rp-num">#47</span></div><div class="rp-body"><div class="rp-tags"><span class="rp-tag lv2">Intermediate</span><span class="rp-tag">Raspberry Pi</span><span class="rp-tag">No extra parts</span></div><h5>Build a LAMP web server with WordPress</h5><p class="rp-s">Install Apache, PHP, and MariaDB. Then install WordPress and use it on your local network.</p><p class="rp-learn"><b>You learn:</b> A web server stack, A database</p><details class="rp-parts"><summary>Parts you need</summary><p>None. Use a Raspberry Pi on your network.</p></details><div class="rp-go"><a href="https://projects.raspberrypi.org/en/projects/lamp-web-server-with-wordpress" target="_blank" rel="noopener noreferrer">Open the guide ↗</a><span class="rp-src">Raspberry Pi Foundation projects</span></div></div></article><article class="rp-card" id="p-build-an-octapi" style="--gc:#00ffc6" data-lv="3" data-b="pi" data-g="net" data-x="1" data-s="build an octapi connect many raspberry pi computers on a private network. one pi sends jobs, and the other pis share the work. cluster computers shared tasks nine raspberry pi 3 boards, a wireless router, short micro usb cables, a power hub, an ethernet cable. unicorn hats are optional. networking"><div class="rp-art"><img src="/images/raspberry-pi-top-50/build-an-octapi.svg" width="360" height="240" loading="lazy" decoding="async" alt="Illustration for Build an OctaPi"><span class="rp-num">#48</span></div><div class="rp-body"><div class="rp-tags"><span class="rp-tag lv3">Advanced</span><span class="rp-tag">Raspberry Pi</span></div><h5>Build an OctaPi</h5><p class="rp-s">Connect many Raspberry Pi computers on a private network. One Pi sends jobs, and the other Pis share the work.</p><p class="rp-learn"><b>You learn:</b> Cluster computers, Shared tasks</p><details class="rp-parts"><summary>Parts you need</summary><p>Nine Raspberry Pi 3 boards, a wireless router, short micro USB cables, a power hub, an Ethernet cable. Unicorn HATs are optional.</p></details><div class="rp-go"><a href="https://projects.raspberrypi.org/en/projects/build-an-octapi" target="_blank" rel="noopener noreferrer">Open the guide ↗</a><span class="rp-src">Raspberry Pi Foundation projects</span></div></div></article></div></div></div><h3 id="grp-sensehat">Sense HAT (2)</h3><div class="not-prose rp-wrap"><div class="rp-group" data-g="sensehat"><p class="rp-gintro">The Sense HAT has an LED matrix, a joystick, and sensors for the environment and motion.</p><div class="rp-concepts" data-g="sensehat"><p class="rp-kicker">Learn the idea first</p><div class="rp-cgrid"><figure style="--neon:#39ff14;--neon2:#c6ff00;--sbg:repeating-linear-gradient(90deg,rgba(57,255,20,.07) 0 1px,transparent 1px 16px),radial-gradient(ellipse at center,#002200 0%,#000 80%);" data-theme="Matrix" class="rp-fig neon" id="fig-log"><h4>How a data logger records</h4><p class="rp-sub">Each tick adds one row to the file.</p><div class="rp-stage"><svg viewBox="0 0 720 230" role="img" aria-label="A timer reads the sensors and adds one row to a CSV file"><defs><filter id="ng-fig-log" x="-10%" y="-10%" width="120%" height="120%"><feGaussianBlur in="SourceGraphic" stdDeviation="2.4" result="b"/><feMerge><feMergeNode in="b"/><feMergeNode in="SourceGraphic"/></feMerge></filter></defs><g filter="url(#ng-fig-log)"><style>#fig-log .lg-r{opacity:0;animation:lg 6s infinite}@keyframes lg{0%{opacity:0}5%,90%{opacity:1}100%{opacity:0}}#fig-log .lg-h{transform-origin:110px 110px;animation:lgh 6s linear infinite}@keyframes lgh{to{transform:rotate(360deg)}}</style><circle cx="110" cy="110" r="60" class="bx" stroke-width="3"/><line class="lg-h" x1="110" y1="110" x2="110" y2="62" stroke="var(--acc)" stroke-width="5" stroke-linecap="round"/><circle cx="110" cy="110" r="5" class="acc"/><text x="110" y="196" text-anchor="middle" font-size="13" class="tm">every minute</text><path d="M180 110 H250" class="ln" stroke-width="2.5"/><rect x="250" y="80" width="90" height="60" rx="8" fill="#1f8a00"/><text x="295" y="115" text-anchor="middle" font-size="13" fill="#fff" font-weight="800">read</text><path d="M340 110 H380" class="ln" stroke-width="2.5"/><rect x="380" y="30" width="320" height="180" rx="8" class="bx" stroke-width="1.5"/><text x="400" y="56" font-size="12" class="tm mono">time, temp °C, humidity, hPa</text><g class="lg-r" style="animation-delay:0.0s"><text x="400" y="82" font-size="13" class="t mono">12:00:00, 20.1, 44%, 1010</text></g><g class="lg-r" style="animation-delay:0.8s"><text x="400" y="104" font-size="13" class="t mono">12:01:00, 21.2, 45%, 1011</text></g><g class="lg-r" style="animation-delay:1.6s"><text x="400" y="126" font-size="13" class="t mono">12:02:00, 22.3, 46%, 1012</text></g><g class="lg-r" style="animation-delay:2.4000000000000004s"><text x="400" y="148" font-size="13" class="t mono">12:03:00, 23.4, 47%, 1013</text></g><g class="lg-r" style="animation-delay:3.2s"><text x="400" y="170" font-size="13" class="t mono">12:04:00, 24.5, 48%, 1014</text></g><g class="lg-r" style="animation-delay:4.0s"><text x="400" y="192" font-size="13" class="t mono">12:05:00, 25.6, 49%, 1015</text></g></g></svg><span class="rp-badge">Matrix</span></div><div class="rp-cap"><p>A<b>data logger</b> repeats two steps. It reads the sensors. Then it adds one line to a CSV file (comma-separated values). A spreadsheet can open the file and draw a chart. Set the program to start at boot, then the Pi can record with no screen or keyboard.</p></div></figure></div></div><div class="rp-grid"><article class="rp-card" id="p-getting-started-with-the-sense-hat" style="--gc:#c6ff00" data-lv="3" data-b="pi" data-g="sensehat" data-x="1" data-s="getting started with the sense hat show text and pictures on the led matrix. read the environment sensors on the board. led matrix temperature, humidity, and pressure sense hat. sense hat"><div class="rp-art"><img src="/images/raspberry-pi-top-50/getting-started-with-the-sense-hat.svg" width="360" height="240" loading="lazy" decoding="async" alt="Illustration for Getting started with the Sense HAT"><span class="rp-num">#49</span></div><div class="rp-body"><div class="rp-tags"><span class="rp-tag lv3">Advanced</span><span class="rp-tag">Raspberry Pi</span></div><h5>Getting started with the Sense HAT</h5><p class="rp-s">Show text and pictures on the LED matrix. Read the environment sensors on the board.</p><p class="rp-learn"><b>You learn:</b> LED matrix, Temperature, humidity, and pressure</p><details class="rp-parts"><summary>Parts you need</summary><p>Sense HAT.</p></details><div class="rp-go"><a href="https://projects.raspberrypi.org/en/projects/getting-started-with-the-sense-hat" target="_blank" rel="noopener noreferrer">Open the guide ↗</a><span class="rp-src">Raspberry Pi Foundation projects</span></div></div></article><article class="rp-card" id="p-sense-hat-data-logger" style="--gc:#c6ff00" data-lv="3" data-b="pi" data-g="sensehat" data-x="1" data-s="sense hat data logger record sensor values to a file at set intervals. set the logger to start when the pi starts. timed logs csv files start a program at boot sense hat. sense hat"><div class="rp-art"><img src="/images/raspberry-pi-top-50/sense-hat-data-logger.svg" width="360" height="240" loading="lazy" decoding="async" alt="Illustration for Sense HAT data logger"><span class="rp-num">#50</span></div><div class="rp-body"><div class="rp-tags"><span class="rp-tag lv3">Advanced</span><span class="rp-tag">Raspberry Pi</span></div><h5>Sense HAT data logger</h5><p class="rp-s">Record sensor values to a file at set intervals. Set the logger to start when the Pi starts.</p><p class="rp-learn"><b>You learn:</b> Timed logs, CSV files, Start a program at boot</p><details class="rp-parts"><summary>Parts you need</summary><p>Sense HAT.</p></details><div class="rp-go"><a href="https://projects.raspberrypi.org/en/projects/sense-hat-data-logger" target="_blank" rel="noopener noreferrer">Open the guide ↗</a><span class="rp-src">Raspberry Pi Foundation projects</span></div></div></article></div></div></div><h3 id="grp-bonus">Beyond the basics (8)</h3><div class="not-prose rp-wrap"><div class="rp-group" data-g="bonus"><p class="rp-gintro">These eight builds are popular with adult makers. They are not on the official projects site. Each link goes to the official documentation or a trusted guide.</p><div class="rp-concepts" data-g="bonus"><p class="rp-kicker">Learn the idea first</p><div class="rp-cgrid"><figure style="--neon:#ff1744;--neon2:#00f0ff;--sbg:radial-gradient(circle at 50% 50%,rgba(255,23,68,.3),transparent 40%),linear-gradient(135deg,#10001a,#000d1a);" data-theme="Shield" class="rp-fig neon" id="fig-dns"><h4>How Pi-hole blocks adverts for the whole network</h4><p class="rp-sub">Select a question. Watch where the answer comes from.</p><div class="rp-stage"><svg viewBox="0 0 720 230" role="img" aria-label="Pi-hole answers DNS questions. It blocks advert domains and forwards other questions."><defs><filter id="ng-fig-dns" x="-10%" y="-10%" width="120%" height="120%"><feGaussianBlur in="SourceGraphic" stdDeviation="2.4" result="b"/><feMerge><feMergeNode in="b"/><feMergeNode in="SourceGraphic"/></feMerge></filter></defs><g filter="url(#ng-fig-dns)"><rect x="20" y="70" width="110" height="90" rx="12" fill="#2a2a5a"/><text x="75" y="120" text-anchor="middle" font-size="14" fill="#fff" font-weight="800">Your device</text><rect x="290" y="60" width="140" height="110" rx="12" fill="#ff1744"/><text x="360" y="104" text-anchor="middle" font-size="15" fill="#fff" font-weight="800">Pi-hole</text><text x="360" y="124" text-anchor="middle" font-size="12" fill="#ffe0e6">on your Pi</text><rect x="590" y="70" width="110" height="90" rx="12" class="bx" stroke-width="1.5"/><text x="645" y="112" text-anchor="middle" font-size="13" font-weight="800" class="t">Upstream</text><text x="645" y="130" text-anchor="middle" font-size="12" class="tm">DNS server</text><path d="M130 100 H290 M290 135 H130 M430 100 H590 M590 135 H430" class="ln" stroke-width="2" stroke-dasharray="4 6"/><g id="dn-q" opacity="0"><rect x="-80" y="-14" width="160" height="28" rx="14" fill="#00b3ff"/><text id="dn-qt" y="5" text-anchor="middle" font-size="12" font-weight="800" fill="#fff" class="mono">ads.example.com?</text></g><g id="dn-f" opacity="0"><rect x="-80" y="-14" width="160" height="28" rx="14" fill="#00b3ff"/><text id="dn-ft" y="5" text-anchor="middle" font-size="12" font-weight="800" fill="#fff" class="mono">news.example.org?</text></g><g id="dn-a" opacity="0"><rect x="-70" y="-14" width="140" height="28" rx="14" fill="#00c853"/><text id="dn-at" y="5" text-anchor="middle" font-size="12" font-weight="800" fill="#fff" class="mono">0.0.0.0</text></g><text id="dn-res" x="360" y="205" text-anchor="middle" font-size="16" font-weight="800" class="t"/></g></svg><span class="rp-badge">Shield</span></div><div class="rp-ctrl"><button class="rp-btn" data-dn="ad">Ask for an advert domain</button><button class="rp-btn" data-dn="ok">Ask for a normal domain</button></div><div class="rp-cap"><p>Before your device loads a page, it asks a<b>DNS server</b> for the address of each domain. Pi-hole becomes that DNS server for your home. If a domain is on a block list, Pi-hole sends back an empty address, so the advert does not load. For other domains, Pi-hole asks an upstream DNS server and sends the answer back.</p><p class="rp-c" style="margin:0"><b>CAUTION</b>The quick install command runs a script from the internet. Read the script before you run it, or use one of the other install methods in the Pi-hole documentation.</p></div></figure></div></div><div class="rp-grid"><article class="rp-card" id="p-pi-hole" style="--gc:#fff01f" data-lv="2" data-b="pi" data-g="bonus" data-x="0" data-s="pi-hole network ad blocker use the pi as the dns server for your home network. it blocks requests to known advert and tracker domains for all devices. dns a static ip address an always-on service none. a wired ethernet connection is better than wi-fi. beyond the basics"><div class="rp-art"><img src="/images/raspberry-pi-top-50/pi-hole.svg" width="360" height="240" loading="lazy" decoding="async" alt="Illustration for Pi-hole network ad blocker"><span class="rp-num">#B1</span></div><div class="rp-body"><div class="rp-tags"><span class="rp-tag lv2">Intermediate (est.)</span><span class="rp-tag">Raspberry Pi</span><span class="rp-tag">No extra parts</span></div><h5>Pi-hole network ad blocker</h5><p class="rp-s">Use the Pi as the DNS server for your home network. It blocks requests to known advert and tracker domains for all devices.</p><p class="rp-learn"><b>You learn:</b> DNS, A static IP address, An always-on service</p><details class="rp-parts"><summary>Parts you need</summary><p>None. A wired Ethernet connection is better than Wi-Fi.</p></details><div class="rp-go"><a href="https://docs.pi-hole.net/main/basic-install/" target="_blank" rel="noopener noreferrer">Open the guide ↗</a><span class="rp-src">Pi-hole documentation</span></div></div></article><article class="rp-card" id="p-home-assistant" style="--gc:#fff01f" data-lv="2" data-b="pi" data-g="bonus" data-x="1" data-s="home assistant hub install home assistant os on a raspberry pi 4 or 5. control smart lights, plugs, and sensors from one dashboard. home automation local control raspberry pi 4 or 5 with 2 gb ram or more, power supply, 32 gb a2 microsd card, ethernet cable. beyond the basics"><div class="rp-art"><img src="/images/raspberry-pi-top-50/home-assistant.svg" width="360" height="240" loading="lazy" decoding="async" alt="Illustration for Home Assistant hub"><span class="rp-num">#B2</span></div><div class="rp-body"><div class="rp-tags"><span class="rp-tag lv2">Intermediate (est.)</span><span class="rp-tag">Raspberry Pi</span></div><h5>Home Assistant hub</h5><p class="rp-s">Install Home Assistant OS on a Raspberry Pi 4 or 5. Control smart lights, plugs, and sensors from one dashboard.</p><p class="rp-learn"><b>You learn:</b> Home automation, Local control</p><details class="rp-parts"><summary>Parts you need</summary><p>Raspberry Pi 4 or 5 with 2 GB RAM or more, power supply, 32 GB A2 microSD card, Ethernet cable.</p></details><div class="rp-go"><a href="https://www.home-assistant.io/installation/raspberrypi" target="_blank" rel="noopener noreferrer">Open the guide ↗</a><span class="rp-src">Home Assistant documentation</span></div></div></article><article class="rp-card" id="p-pi-nas" style="--gc:#fff01f" data-lv="2" data-b="pi" data-g="bonus" data-x="1" data-s="home nas with openmediavault connect a usb 3 drive to a pi 4 and install openmediavault. share files and backups on your home network. network file shares backups raspberry pi 4 (the guide uses 8 gb), usb 3.0 hard drive or ssd, power supply. beyond the basics"><div class="rp-art"><img src="/images/raspberry-pi-top-50/pi-nas.svg" width="360" height="240" loading="lazy" decoding="async" alt="Illustration for Home NAS with OpenMediaVault"><span class="rp-num">#B3</span></div><div class="rp-body"><div class="rp-tags"><span class="rp-tag lv2">Intermediate (est.)</span><span class="rp-tag">Raspberry Pi</span></div><h5>Home NAS with OpenMediaVault</h5><p class="rp-s">Connect a USB 3 drive to a Pi 4 and install OpenMediaVault. Share files and backups on your home network.</p><p class="rp-learn"><b>You learn:</b> Network file shares, Backups</p><details class="rp-parts"><summary>Parts you need</summary><p>Raspberry Pi 4 (the guide uses 8 GB), USB 3.0 hard drive or SSD, power supply.</p></details><div class="rp-go"><a href="https://core-electronics.com.au/guides/how-to-raspberry-pi-nas/" target="_blank" rel="noopener noreferrer">Open the guide ↗</a><span class="rp-src">Core Electronics guide</span></div></div></article><article class="rp-card" id="p-ai-hat-plus-2-llm" style="--gc:#fff01f" data-lv="3" data-b="pi" data-g="bonus" data-x="1" data-s="local ai chat with the ai hat+ 2 install an ai hat+ 2 on a raspberry pi 5. use the hailo ollama server to run a small language model on the device. npu accelerators local language models data that stays at home raspberry pi 5, ai hat+ 2, 64-bit raspberry pi os. beyond the basics"><div class="rp-art"><img src="/images/raspberry-pi-top-50/ai-hat-plus-2-llm.svg" width="360" height="240" loading="lazy" decoding="async" alt="Illustration for Local AI chat with the AI HAT+ 2"><span class="rp-num">#B4</span></div><div class="rp-body"><div class="rp-tags"><span class="rp-tag lv3">Advanced (est.)</span><span class="rp-tag">Raspberry Pi</span></div><h5>Local AI chat with the AI HAT+ 2</h5><p class="rp-s">Install an AI HAT+ 2 on a Raspberry Pi 5. Use the Hailo Ollama server to run a small language model on the device.</p><p class="rp-learn"><b>You learn:</b> NPU accelerators, Local language models, Data that stays at home</p><details class="rp-parts"><summary>Parts you need</summary><p>Raspberry Pi 5, AI HAT+ 2, 64-bit Raspberry Pi OS.</p></details><div class="rp-go"><a href="https://www.raspberrypi.com/documentation/computers/ai.html" target="_blank" rel="noopener noreferrer">Open the guide ↗</a><span class="rp-src">Raspberry Pi documentation</span></div></div></article><article class="rp-card" id="p-ai-camera" style="--gc:#fff01f" data-lv="2" data-b="pi" data-g="bonus" data-x="1" data-s="ai camera object detection the ai camera runs a neural network on its sony imx500 sensor. the pi receives the image and a list of the objects that the camera found. ai on the sensor object detection raspberry pi ai camera. the page names a raspberry pi 4 or 5. other models need small changes. beyond the basics"><div class="rp-art"><img src="/images/raspberry-pi-top-50/ai-camera.svg" width="360" height="240" loading="lazy" decoding="async" alt="Illustration for AI Camera object detection"><span class="rp-num">#B5</span></div><div class="rp-body"><div class="rp-tags"><span class="rp-tag lv2">Intermediate (est.)</span><span class="rp-tag">Raspberry Pi</span></div><h5>AI Camera object detection</h5><p class="rp-s">The AI Camera runs a neural network on its Sony IMX500 sensor. The Pi receives the image and a list of the objects that the camera found.</p><p class="rp-learn"><b>You learn:</b> AI on the sensor, Object detection</p><details class="rp-parts"><summary>Parts you need</summary><p>Raspberry Pi AI Camera. The page names a Raspberry Pi 4 or 5. Other models need small changes.</p></details><div class="rp-go"><a href="https://www.raspberrypi.com/documentation/accessories/ai-camera.html" target="_blank" rel="noopener noreferrer">Open the guide ↗</a><span class="rp-src">Raspberry Pi documentation</span></div></div></article><article class="rp-card" id="p-magicmirror" style="--gc:#fff01f" data-lv="2" data-b="pi" data-g="bonus" data-x="1" data-s="magicmirror² smart mirror put a monitor behind a two-way mirror. magicmirror² shows the time, the weather, and your calendar through the glass. node.js apps modules and settings a monitor. for the mirror effect, also a two-way mirror and a frame. beyond the basics"><div class="rp-art"><img src="/images/raspberry-pi-top-50/magicmirror.svg" width="360" height="240" loading="lazy" decoding="async" alt="Illustration for MagicMirror² smart mirror"><span class="rp-num">#B6</span></div><div class="rp-body"><div class="rp-tags"><span class="rp-tag lv2">Intermediate (est.)</span><span class="rp-tag">Raspberry Pi</span></div><h5>MagicMirror² smart mirror</h5><p class="rp-s">Put a monitor behind a two-way mirror. MagicMirror² shows the time, the weather, and your calendar through the glass.</p><p class="rp-learn"><b>You learn:</b> Node.js apps, Modules and settings</p><details class="rp-parts"><summary>Parts you need</summary><p>A monitor. For the mirror effect, also a two-way mirror and a frame.</p></details><div class="rp-go"><a href="https://docs.magicmirror.builders/getting-started/installation.html" target="_blank" rel="noopener noreferrer">Open the guide ↗</a><span class="rp-src">MagicMirror² documentation</span></div></div></article><article class="rp-card" id="p-octoprint" style="--gc:#fff01f" data-lv="2" data-b="pi" data-g="bonus" data-x="1" data-s="octoprint 3d printer control write the octopi image with raspberry pi imager. then control your 3d printer and its prints from a web browser. printer control over usb a web dashboard raspberry pi 3b, 3b+, 4b, or zero 2, a 3d printer with usb. a camera is optional. beyond the basics"><div class="rp-art"><img src="/images/raspberry-pi-top-50/octoprint.svg" width="360" height="240" loading="lazy" decoding="async" alt="Illustration for OctoPrint 3D printer control"><span class="rp-num">#B7</span></div><div class="rp-body"><div class="rp-tags"><span class="rp-tag lv2">Intermediate (est.)</span><span class="rp-tag">Raspberry Pi</span></div><h5>OctoPrint 3D printer control</h5><p class="rp-s">Write the OctoPi image with Raspberry Pi Imager. Then control your 3D printer and its prints from a web browser.</p><p class="rp-learn"><b>You learn:</b> Printer control over USB, A web dashboard</p><details class="rp-parts"><summary>Parts you need</summary><p>Raspberry Pi 3B, 3B+, 4B, or Zero 2, a 3D printer with USB. A camera is optional.</p></details><div class="rp-go"><a href="https://octoprint.org/download/" target="_blank" rel="noopener noreferrer">Open the guide ↗</a><span class="rp-src">OctoPrint</span></div></div></article><article class="rp-card" id="p-piaware" style="--gc:#fff01f" data-lv="2" data-b="pi" data-g="bonus" data-x="1" data-s="piaware flight tracker receive the ads-b radio messages that aircraft send on 1090 mhz. show the aircraft near you on a map. software-defined radio ads-b messages raspberry pi 3, 4, or zero w, power supply, usb sdr receiver, 1090 mhz antenna. beyond the basics"><div class="rp-art"><img src="/images/raspberry-pi-top-50/piaware.svg" width="360" height="240" loading="lazy" decoding="async" alt="Illustration for PiAware flight tracker"><span class="rp-num">#B8</span></div><div class="rp-body"><div class="rp-tags"><span class="rp-tag lv2">Intermediate (est.)</span><span class="rp-tag">Raspberry Pi</span></div><h5>PiAware flight tracker</h5><p class="rp-s">Receive the ADS-B radio messages that aircraft send on 1090 MHz. Show the aircraft near you on a map.</p><p class="rp-learn"><b>You learn:</b> Software-defined radio, ADS-B messages</p><details class="rp-parts"><summary>Parts you need</summary><p>Raspberry Pi 3, 4, or Zero W, power supply, USB SDR receiver, 1090 MHz antenna.</p></details><div class="rp-go"><a href="https://www.flightaware.com/adsb/piaware/build" target="_blank" rel="noopener noreferrer">Open the guide ↗</a><span class="rp-src">FlightAware</span></div></div></article></div></div></div><h2 id="kit">Starter kit: parts you use again and again</h2><div class="not-prose rp-wrap"><p>Many projects use the same small parts. Buy the six parts with the starter kit label together. Then you can build most of the GPIO projects. The count includes only projects 1 to 50.</p><div class="rp-tw"><table class="rp-t"><thead><tr><th>Part</th><th>What it does</th><th>Projects</th><th>For example</th></tr></thead><tbody><tr><td><b>Jumper wires</b><span class="rp-kit">starter kit</span></td><td>Connect the pins of the Pi to the parts.</td><td style="min-width:150px"><div style="display:flex;align-items:center;gap:8px"><div class="rp-barc" style="width:110px"/><b>25</b></div></td><td style="font-size:.85rem"><a href="#p-physical-computing" data-jump="physical-computing">Physical Computing with Python</a>,<a href="#p-physical-computing-with-scratch" data-jump="physical-computing-with-scratch">Physical Computing with Scratch</a>,<a href="#p-gpio-music-box" data-jump="gpio-music-box">GPIO music box</a> and 22 more</td></tr><tr><td><b>Breadboard</b><span class="rp-kit">starter kit</span></td><td>Holds the parts and connects them without solder.</td><td style="min-width:150px"><div style="display:flex;align-items:center;gap:8px"><div class="rp-barc" style="width:48px"/><b>11</b></div></td><td style="font-size:.85rem"><a href="#p-physical-computing" data-jump="physical-computing">Physical Computing with Python</a>,<a href="#p-gpio-music-box" data-jump="gpio-music-box">GPIO music box</a>,<a href="#p-python-quick-reaction-game" data-jump="python-quick-reaction-game">Python quick reaction game</a> and 8 more</td></tr><tr><td><b>Resistors (47–330 Ω)</b><span class="rp-kit">starter kit</span></td><td>Limit the current. Use one with each LED.</td><td style="min-width:150px"><div style="display:flex;align-items:center;gap:8px"><div class="rp-barc" style="width:48px"/><b>11</b></div></td><td style="font-size:.85rem"><a href="#p-physical-computing" data-jump="physical-computing">Physical Computing with Python</a>,<a href="#p-physical-computing-with-scratch" data-jump="physical-computing-with-scratch">Physical Computing with Scratch</a>,<a href="#p-python-quick-reaction-game" data-jump="python-quick-reaction-game">Python quick reaction game</a> and 8 more</td></tr><tr><td><b>LEDs</b><span class="rp-kit">starter kit</span></td><td>Give light when current flows through them.</td><td style="min-width:150px"><div style="display:flex;align-items:center;gap:8px"><div class="rp-barc" style="width:40px"/><b>9</b></div></td><td style="font-size:.85rem"><a href="#p-physical-computing" data-jump="physical-computing">Physical Computing with Python</a>,<a href="#p-physical-computing-with-scratch" data-jump="physical-computing-with-scratch">Physical Computing with Scratch</a>,<a href="#p-python-quick-reaction-game" data-jump="python-quick-reaction-game">Python quick reaction game</a> and 6 more</td></tr><tr><td><b>Push buttons</b><span class="rp-kit">starter kit</span></td><td>Give an input when you push them.</td><td style="min-width:150px"><div style="display:flex;align-items:center;gap:8px"><div class="rp-barc" style="width:35px"/><b>8</b></div></td><td style="font-size:.85rem"><a href="#p-physical-computing" data-jump="physical-computing">Physical Computing with Python</a>,<a href="#p-physical-computing-with-scratch" data-jump="physical-computing-with-scratch">Physical Computing with Scratch</a>,<a href="#p-gpio-music-box" data-jump="gpio-music-box">GPIO music box</a> and 5 more</td></tr><tr><td><b>Camera Module</b></td><td>Takes photos and video. Connect it with a ribbon cable.</td><td style="min-width:150px"><div style="display:flex;align-items:center;gap:8px"><div class="rp-barc" style="width:35px"/><b>8</b></div></td><td style="font-size:.85rem"><a href="#p-getting-started-with-picamera" data-jump="getting-started-with-picamera">Getting started with the Camera Module</a>,<a href="#p-cress-egg-heads" data-jump="cress-egg-heads">Cress egg heads</a>,<a href="#p-push-button-stop-motion" data-jump="push-button-stop-motion">Push-button stop motion</a> and 5 more</td></tr><tr><td><b>Raspberry Pi Pico</b></td><td>Runs one MicroPython program. It is a low-cost second board.</td><td style="min-width:150px"><div style="display:flex;align-items:center;gap:8px"><div class="rp-barc" style="width:35px"/><b>8</b></div></td><td style="font-size:.85rem"><a href="#p-get-started-pico-w" data-jump="get-started-pico-w">Getting started with Raspberry Pi Pico W</a>,<a href="#p-getting-started-with-the-pico" data-jump="getting-started-with-the-pico">Getting started with Raspberry Pi Pico</a>,<a href="#p-led-firefly" data-jump="led-firefly">LED firefly</a> and 5 more</td></tr><tr><td><b>Buzzer</b><span class="rp-kit">starter kit</span></td><td>Makes a sound or a tone.</td><td style="min-width:150px"><div style="display:flex;align-items:center;gap:8px"><div class="rp-barc" style="width:31px"/><b>7</b></div></td><td style="font-size:.85rem"><a href="#p-physical-computing" data-jump="physical-computing">Physical Computing with Python</a>,<a href="#p-physical-computing-with-scratch" data-jump="physical-computing-with-scratch">Physical Computing with Scratch</a>,<a href="#p-laser-tripwire" data-jump="laser-tripwire">Raspberry Pi laser tripwire</a> and 4 more</td></tr><tr><td><b>Sense HAT</b></td><td>Gives an LED matrix, a joystick, and sensors on one board.</td><td style="min-width:150px"><div style="display:flex;align-items:center;gap:8px"><div class="rp-barc" style="width:26px"/><b>6</b></div></td><td style="font-size:.85rem"><a href="#p-sensehat-scratch-mp3-player" data-jump="sensehat-scratch-mp3-player">Sense HAT music player</a>,<a href="#p-sense-hat-pong" data-jump="sense-hat-pong">Sense HAT Pong</a>,<a href="#p-flappy-astronaut" data-jump="flappy-astronaut">Flappy Astronaut</a> and 3 more</td></tr><tr><td><b>PIR motion sensor</b></td><td>Senses the heat of a person who moves.</td><td style="min-width:150px"><div style="display:flex;align-items:center;gap:8px"><div class="rp-barc" style="width:18px"/><b>4</b></div></td><td style="font-size:.85rem"><a href="#p-physical-computing" data-jump="physical-computing">Physical Computing with Python</a>,<a href="#p-physical-computing-with-scratch" data-jump="physical-computing-with-scratch">Physical Computing with Scratch</a>,<a href="#p-santa-detector" data-jump="santa-detector">Santa detector</a> and 1 more</td></tr><tr><td><b>DC motors and controller</b></td><td>Turn wheels. The controller supplies the motor power.</td><td style="min-width:150px"><div style="display:flex;align-items:center;gap:8px"><div class="rp-barc" style="width:18px"/><b>4</b></div></td><td style="font-size:.85rem"><a href="#p-physical-computing" data-jump="physical-computing">Physical Computing with Python</a>,<a href="#p-build-a-buggy" data-jump="build-a-buggy">Build a robot buggy</a>,<a href="#p-rpi-python-line-following" data-jump="rpi-python-line-following">Build a line-following robot</a> and 1 more</td></tr><tr><td><b>Ultrasonic sensor</b></td><td>Measures distance with sound pulses.</td><td style="min-width:150px"><div style="display:flex;align-items:center;gap:8px"><div class="rp-barc" style="width:13px"/><b>3</b></div></td><td style="font-size:.85rem"><a href="#p-physical-computing" data-jump="physical-computing">Physical Computing with Python</a>,<a href="#p-ultrasonic-theremin" data-jump="ultrasonic-theremin">Ultrasonic theremin</a>,<a href="#p-touch-free-tap" data-jump="touch-free-tap">Touch-free tap</a></td></tr><tr><td><b>Potentiometer</b></td><td>Gives a value that changes when you turn the dial.</td><td style="min-width:150px"><div style="display:flex;align-items:center;gap:8px"><div class="rp-barc" style="width:13px"/><b>3</b></div></td><td style="font-size:.85rem"><a href="#p-physical-computing" data-jump="physical-computing">Physical Computing with Python</a>,<a href="#p-beating-heart" data-jump="beating-heart">Beating heart</a>,<a href="#p-sound-machine" data-jump="sound-machine">Sound machine</a></td></tr><tr><td><b>Speakers or headphones</b></td><td>Play sound from the Pi.</td><td style="min-width:150px"><div style="display:flex;align-items:center;gap:8px"><div class="rp-barc" style="width:13px"/><b>3</b></div></td><td style="font-size:.85rem"><a href="#p-gpio-music-box" data-jump="gpio-music-box">GPIO music box</a>,<a href="#p-whoopi-cushion" data-jump="whoopi-cushion">Whoopi cushion</a>,<a href="#p-sensehat-scratch-mp3-player" data-jump="sensehat-scratch-mp3-player">Sense HAT music player</a></td></tr><tr><td><b>Build HAT + LEGO motors</b></td><td>Connects LEGO Technic motors and sensors to the Pi.</td><td style="min-width:150px"><div style="display:flex;align-items:center;gap:8px"><div class="rp-barc" style="width:13px"/><b>3</b></div></td><td style="font-size:.85rem"><a href="#p-lego-robot-car" data-jump="lego-robot-car">LEGO remote-controlled car</a>,<a href="#p-lego-robot-face" data-jump="lego-robot-face">LEGO robot face</a>,<a href="#p-lego-game-controller" data-jump="lego-game-controller">LEGO game controller</a></td></tr><tr><td><b>Light sensor (LDR)</b></td><td>Changes its resistance with the light level.</td><td style="min-width:150px"><div style="display:flex;align-items:center;gap:8px"><div class="rp-barc" style="width:9px"/><b>2</b></div></td><td style="font-size:.85rem"><a href="#p-physical-computing" data-jump="physical-computing">Physical Computing with Python</a>,<a href="#p-laser-tripwire" data-jump="laser-tripwire">Raspberry Pi laser tripwire</a></td></tr></tbody></table></div></div><h2 id="about">About this guide</h2><div class="not-prose rp-wrap"><p>The summaries on this page are original. They are not copies of the guides. Open each link for the full steps. Projects 1 to 50 come from the free<a href="https://projects.raspberrypi.org/en/projects" target="_blank" rel="noopener">Raspberry Pi Foundation projects site</a> and from articles in<a href="https://magazine.raspberrypi.com" target="_blank" rel="noopener">Raspberry Pi Official Magazine</a>. The levels for projects 1 to 50 come from the projects catalogue. The levels for builds B1 to B8 are our estimate.</p><p>Two projects have the label<b>Archived</b>: The All-Seeing Pi and Sense HAT Pong. Their pages are online, but the main catalogue does not list them. We checked all links on 4 October 2026. The parts lists show only what each page lists.</p><p>All pictures and diagrams on this page are original drawings. The body text uses the rules of<a href="https://www.asd-ste100.org" target="_blank" rel="noopener">ASD-STE100 Simplified Technical English</a>: short sentences, one idea in each sentence, and active verbs.</p></div></div><script>(function(){var f=document.getElementById('fig-gpio');if(!f)return;var info=document.getElementById('gpio-info');
function txt(n,v){if(v==='3V3')return '<b>Pin '+n+' · 3.3 V power.</b> Use it to supply small sensors. It is not a GPIO pin.';
if(v==='5V')return '<b>Pin '+n+' · 5 V power.</b> Some add-ons use it. Do not connect it to a GPIO pin.';
if(v==='GND')return '<b>Pin '+n+' · Ground (0 V).</b> Each circuit must connect back to ground.';
if(v==='ID')return '<b>Pin '+n+' · ID pin.</b> HAT boards use it to identify themselves. Do not use it for your own parts.';
var p=v.split(':'),s='<b>Pin '+n+' · GPIO '+p[0]+'.</b> An input or an output with 3.3 V logic. In code, use the number '+p[0]+'.';
if(p[1])s+=' It can also do<b>'+p[1]+'</b>'+(p[1].indexOf('I2C')===0?' (a two-wire sensor bus).':p[1].indexOf('SPI')===0?' (a fast bus for chips such as the MCP3008).':p[1].indexOf('UART')===0?' (a serial text link).':' (hardware pulse output for dimmers and motors).');return s;}
var pins=f.querySelectorAll('.pin');pins.forEach(function(g){function sel(){pins.forEach(function(x){x.classList.remove('sel','dim')});g.classList.add('sel');info.innerHTML=txt(g.dataset.n,g.dataset.v);}
g.addEventListener('click',sel);g.addEventListener('keydown',function(e){if(e.key==='Enter'||e.key===' '){e.preventDefault();sel();}});});
f.querySelectorAll('.rp-legend span').forEach(function(s){s.addEventListener('click',function(){var k=s.dataset.k,c=0;pins.forEach(function(g){var on=g.classList.contains(k);g.classList.toggle('dim',!on);g.classList.remove('sel');if(on)c++;});
info.innerHTML=s.textContent+': '+c+' pins.';});});})();
(function(){var f=document.getElementById('fig-ipo');if(!f)return;var d=f.querySelector('#ipo-dot'),led=f.querySelector('#ipo-led'),gl=f.querySelector('#ipo-glow'),cap=f.querySelector('#ipo-cap'),pi=f.querySelector('#ipo-pi'),busy=false;
function lerp(a,b,t){return a+(b-a)*t}
function move(x0,x1,ms,cb){var s=null;function st(ts){if(!s)s=ts;var t=Math.min(1,(ts-s)/ms);d.setAttribute('cx',lerp(x0,x1,t));d.setAttribute('cy',120);if(t<1)requestAnimationFrame(st);else cb();}requestAnimationFrame(st);}= function= run(){if(busy)return;busy=true;cap.setAttribute('r',22);d.setAttribute('opacity',1); move(150,285,600,function(){cap.setAttribute('r',26);pi.setAttribute('fill','#b026ff');setTimeout(function(){pi.setAttribute('fill','#7a00ff');move(465,585,500,function(){d.setAttribute('opacity',0);led.setAttribute('opacity',1);gl.setAttribute('opacity',.35);= setTimeout(function(){led.setAttribute('opacity',.35);gl.setAttribute('opacity',0);busy=false;},1400);});},350);});} var= b=f.querySelector('#ipo-btn');b.addEventListener('click',run);b.addEventListener('keydown',function(e){if(e.key==='Enter'||e.key===' '){e.preventDefault();run();}});= var= auto=setInterval(function(){if(document.hidden)return;var r=f.getBoundingClientRect();if(r.top<innerHeight&&r.bottom>0)run();},5000);b.addEventListener('click',function(){clearInterval(auto)});})();
(function(){var f=document.getElementById('fig-led');if(!f)return;var out=f.querySelector('#led-out'),gl=f.querySelector('#led-glow'),rl=f.querySelector('#led-rl'),fl=f.querySelector('#led-flow');
f.querySelectorAll('[data-r]').forEach(function(b){b.addEventListener('click',function(){f.querySelectorAll('[data-r]').forEach(function(x){x.classList.remove('on')});b.classList.add('on');
var r=+b.dataset.r,i=1.3/r*1000;out.textContent='I = (3.3 V − 2.0 V) ÷ '+r+' Ω ≈ '+i.toFixed(1)+' mA';rl.textContent=r+' Ω';gl.setAttribute('opacity',Math.min(.6,i/10).toFixed(2));fl.style.animationDuration=(4/i).toFixed(2)+'s';});});})();
(function(){var f=document.getElementById('fig-pwm');if(!f)return;var w=f.querySelector('#pwm-w'),g=f.querySelector('#pwm-g'),r=f.querySelector('#pwm-r'),o=f.querySelector('#pwm-o');
function draw(){var d=+r.value/100,p='M40 150',n=5,cw=520/n;for(var i=0;i<n;i++){var x=40+i*cw,on=cw*d;if(d>0){p+=' L'+x+' 50 L'+(x+on)+' 50';}if(d<1){p+=' L'+(x+on)+'= 150= L'+(x+cw)+'= 150';}}= w.setAttribute('d',p);g.setAttribute('opacity',(0.05+d*0.6).toFixed(2));o.textContent=r.value+'% on= ·= average= ≈= '+(3.3*d).toFixed(1)+'= V';}= r.addEventListener('input',draw);draw();})();= (function(){var= f=document.getElementById('fig-us');if(!f)return;var r=f.querySelector('#us-r'),h=f.querySelector('#us-h'),p=f.querySelector('#us-p'),o=f.querySelector('#us-o'),dl=f.querySelector('#us-dl'),dt=f.querySelector('#us-dt'),x=0,dir=1,hx=0; function= set(){var= cm=+r.value;hx=170+cm*5;h.setAttribute('transform','translate('+hx+' 92)');dl.setAttribute('x2',hx);dt.setAttribute('x',(150+hx)/2);dt.textContent=cm+' cm';= o.textContent='echo time ≈ ' +(cm*2/34300*1000).toFixed(2)+'= ms';}= r.addEventListener('input',set);set();x=150; function= tick(){x+=dir*4;if(x>hx-12){dir=-1;}if(x<150){x=150;dir=1;}p.setAttribute('transform','translate('+x+' 95)'+(dir<0?'= scale(-1= 1)':''));requestAnimationFrame(tick);}= if(!matchMedia('(prefers-reduced-motion:= reduce)').matches)requestAnimationFrame(tick);else= p.setAttribute('transform','translate(170= 95)');})();= (function(){var= f=document.getElementById('fig-relay');if(!f)return;var on=false,b=f.querySelector('#rl-b'); b.addEventListener('click',function(){on=!on;b.classList.toggle('on',on);b.textContent=on?'Move the= hand= away':'Put= a= hand= near= the= sensor';= f.querySelector('#rl-arm').setAttribute('y2',on?140:112);['#rl-cf','#rl-lf','#rl-w','#rl-mag'].forEach(function(s){f.querySelector(s).setAttribute('opacity',on?1:0)});= f.querySelector('#rl-o').textContent='GPIO pin: ' +(on?'ON':'OFF')+'= ·= pump:= '+(on?'ON':'OFF');});})();= (function(){var= f=document.getElementById('fig-ndvi');if(!f)return;var S={h:[.50,.08,'#39ff14','healthy'],s:[.30,.20,'#ffb000','stressed']}; f.querySelectorAll('[data-nd]').forEach(function(b){b.addEventListener('click',function(){f.querySelectorAll('[data-nd]').forEach(function(x){x.classList.remove('on')});b.classList.add('on');= var= v=S[b.dataset.nd],n=v[0],r=v[1],H=200;f.querySelector('#nd-nir').setAttribute('y',180-n*H);f.querySelector('#nd-nir').setAttribute('height',n*H); f.querySelector('#nd-red').setAttribute('y',180-r*H);f.querySelector('#nd-red').setAttribute('height',r*H);f.querySelector('#nd-leaf').setAttribute('fill',v[2]);= f.querySelector('#nd-v').textContent=((n-r)/(n+r)).toFixed(2);f.querySelector('#nd-l').textContent=v[3];});});})(); (function(){var= f=document.getElementById('fig-line');if(!f)return;var S=[[175,0,0,0,'Go forward'],[123,1,0,-35,'Turn= left'],[227,0,1,35,'Turn= right'],[120,1,1,180,'Stop= (junction)']];= f.querySelectorAll('[data-lf]').forEach(function(b){b.addEventListener('click',function(){f.querySelectorAll('[data-lf]').forEach(function(x){x.classList.remove('on')});b.classList.add('on');= var= s=S[+b.dataset.lf];var ln=f.querySelector('#lf-line');ln.setAttribute('x',s[0]);ln.setAttribute('width',s[4].indexOf('Stop')===0?140:30); f.querySelector('#lf-sl').setAttribute('fill',s[1]?'#39ff14':'#334155');f.querySelector('#lf-sr').setAttribute('fill',s[2]?'#39ff14':'#334155');= f.querySelector('#lf-arrow').setAttribute('transform','translate(530= 120)= rotate('+s[3]+')');f.querySelector('#lf-act').textContent=s[4];});});})(); (function(){var= f=document.getElementById('fig-game');if(!f)return;var cs=f.querySelectorAll('.gl-c'),ss=f.querySelectorAll('.gl-s'),k=0,bx=3,by=2,dx=1,dy=1,bat=3; function= draw(){cs.forEach(function(c){c.setAttribute('fill','#1a0533')});for(var= i=-1;i<=1;i++){cs[(bat+i)*8].setAttribute('fill','#ff10f0');}cs[by*8+bx].setAttribute('fill','#00f0ff');} function= step(){ss.forEach(function(s,i){s.querySelector('rect').style.stroke=i===k?'var(--acc)':'';s.querySelector('rect').style.strokeWidth=i===k?4:2;}); if(k===0){bat+= by=>bat?1:by<bat?-1:0;bat=Math.max(1,Math.min(6,bat));} if(k===1){bx+=dx;by+=dy;} if(k===2){if(bx>=7||bx<=1){dx=-dx;}if(by>=7||by<=0){dy=-dy;}bx=Math.max(1,Math.min(7,bx));by=Math.max(0,Math.min(7,by));} if(k===3)draw();k=(k+1)%4;} draw();if(!matchMedia('(prefers-reduced-motion:= reduce)').matches)setInterval(function(){if(!document.hidden)step();},420);})();= (function(){var= f=document.getElementById('fig-dns');if(!f)return;var q=f.querySelector('#dn-q'),fw=f.querySelector('#dn-f'),a=f.querySelector('#dn-a'),res=f.querySelector('#dn-res'),busy=false; function= anim(el,x0,y0,x1,y1,ms,cb){var= s=null;el.setAttribute('opacity',1);function st(t){if(!s)s=t;var k=Math.min(1,(t-s)/ms);el.setAttribute('transform','translate('+(x0+(x1-x0)*k)+' '+(y0+(y1-y0)*k)+')');if(k<1)requestAnimationFrame(st);else{el.setAttribute('opacity',0);cb&&cb();}}requestAnimationFrame(st);}= function= run(kind){if(busy)return;busy=true;res.textContent='';var ad=kind==='ad';f.querySelector('#dn-qt').textContent=ad?'ads.example.com?':'news.example.org?'; f.querySelectorAll('[data-dn]').forEach(function(b){b.classList.toggle('on',b.dataset.dn===kind)}); anim(q,180,100,280,100,700,function(){if(ad){f.querySelector('#dn-at').textContent='0.0.0.0' ;anim(a,280,135,180,135,700,function(){res.textContent='Blocked: the advert does not load.' ;busy=false;});} else{anim(fw,470,100,560,100,600,function(){f.querySelector('#dn-at').textContent='203.0.113.7' ;anim(a,560,135,470,135,600,function(){anim(a,280,135,180,135,600,function(){res.textContent='Forwarded: the page loads as normal.' ;busy=false;});});});}});} f.querySelectorAll('[data-dn]').forEach(function(b){b.addEventListener('click',function(){run(b.dataset.dn)})});})();= (function(){var= root=document.getElementById('rpkb');if(!root)return; var= cards=[].slice.call(root.querySelectorAll('.rp-card')),groups=[].slice.call(root.querySelectorAll('.rp-group')); var= q=document.getElementById('rp-q'),lv=document.getElementById('rp-lv'),b=document.getElementById('rp-b'),g=document.getElementById('rp-g'),x=document.getElementById('rp-x'), cnt=document.getElementById('rp-count'),empty=document.getElementById('rp-empty'),pn=document.getElementById('rp-pathnote'),PATHS=[["First weekend",= ["raspberry-pi-setting-up",= "raspberry-pi-using",= "pacman-terminal",= "physical-computing-with-scratch",= "santa-detector",= "python-web-server-with-flask"]],= ["With= kids",= ["scratch-led-game",= "rpi-wire-loop-game-scratch",= "ultrasonic-theremin",= "whoopi-cushion",= "led-firefly",= "party-popper"]],= ["Road= to= a= robot",= ["physical-computing",= "python-quick-reaction-game",= "build-a-buggy",= "remote-control-buggy",= "rpi-python-line-following"]],= ["Pico= only",= ["getting-started-with-the-pico",= "led-firefly",= "beating-heart",= "sound-machine",= "time-to-make",= "get-started-pico-w"]],= ["Camera= and= nature",= ["getting-started-with-picamera",= "parent-detector",= "cress-egg-heads",= "push-button-stop-motion",= "infrared-bird-box",= "astropi-ndvi"]],= ["Home= server",= ["python-web-server-with-flask",= "lamp-web-server-with-wordpress",= "pi-hole",= "pi-nas",= "home-assistant"]]],path=-1,noX=false; function= head(gr){var= w=gr.closest('.rp-wrap');var h=w&&w.previousElementSibling;return (h&&/^H[23]$/.test(h.tagName))?h:null;}= function= apply(){var= t=(q.value||'').trim().toLowerCase(),shown=0,active=!!(t||lv.value||b.value||g.value||noX||path>=0);
var ids=path>=0?PATHS[path][1]:null;
cards.forEach(function(c){var ok=true;if(t&&c.dataset.s.indexOf(t)<0)ok=false;if(lv.value&&c.dataset.lv!==lv.value)ok=false;if(b.value&&c.dataset.b!==b.value)ok=false; if(g.value&&c.dataset.g!==g.value)ok=false;if(noX&&c.dataset.x!=='0')ok=false;if(ids&&ids.indexOf(c.id.slice(2))<0)ok=false;c.classList.toggle('hide',!ok);if(ok)shown++;}); groups.forEach(function(gr){var= vis=gr.querySelectorAll('.rp-card:not(.hide)').length>0;var w=gr.closest('.rp-wrap');w.style.display=vis?'':'none';var h=head(gr);if(h)h.style.display=vis?'':'none';
var cc=gr.querySelector('.rp-concepts');if(cc)cc.style.display=active?'none':'';});
cnt.textContent='Showing '+shown+' of '+cards.length;empty.classList.toggle('on',shown===0);
x.classList.toggle('on',noX);x.setAttribute('aria-pressed',noX);
if(path>=0){pn.innerHTML='<b>Path: '+PATHS[path][0]+'.</b> Do the projects in the order of the path list above.';pn.classList.add('on');}else{pn.classList.remove('on');}
root.querySelectorAll('[data-path]').forEach(function(bt){bt.classList.toggle('on',+bt.dataset.path===path);bt.textContent=+bt.dataset.path===path?'Show all projects':'Show only this path';});}
[q,lv,b,g].forEach(function(el){el.addEventListener('input',apply);el.addEventListener('change',apply);});
x.addEventListener('click',function(){noX=!noX;apply();});
document.getElementById('rp-reset').addEventListener('click',function(){q.value='';lv.value='';b.value='';g.value='';noX=false;path=-1;apply();});
root.querySelectorAll('[data-path]').forEach(function(bt){bt.addEventListener('click',function(){var i=+bt.dataset.path;path=(path===i)?-1:i;q.value='';lv.value='';b.value='';g.value='';noX=false;apply();
if(path>=0)document.getElementById('rp-bar').scrollIntoView({behavior:'smooth',block:'start'});});});
root.querySelectorAll('[data-jump]').forEach(function(a){a.addEventListener('click',function(ev){var c=document.getElementById('p-'+a.dataset.jump);if(!c)return;ev.preventDefault();
if(c.classList.contains('hide')){q.value='';lv.value='';b.value='';g.value='';noX=false;path=-1;apply();}
c.scrollIntoView({behavior:'smooth',block:'center'});c.classList.remove('pulse');void c.offsetWidth;c.classList.add('pulse');});});
apply();})();</script>
]]></content:encoded><media:content url="https://curiousbit.netlify.app/images/raspberry-pi-top-50/hero-v2.png" medium="image"><media:title type="plain">Electronics</media:title></media:content><category>raspberry-pi</category><category>electronics</category><category>iot</category><category>maker</category><category>Knowledge Base</category></item></channel></rss>